JavaScript高级程序设计(第3版)学习笔记8 js函数(4)

3、caller属性主要和函数的caller相区分,值永远都是undefined

 
函数属性   caller     调用当前函数的函数   虽然函数一定义就可访问,但是不在函数体内访问时永远为null,在函数体内访问时返回调用当前函数的函数,在全局作用域中调用函数也会返回null  
length     函数形式参数的长度   就是定义函数时命名的参数个数  
prototype     函数原型对象   原型对象是ECMAScript实现继承的基础  
constructor     继承自Object,表示创建函数实例的函数,也就是Function()   值永远是Function,也就是内置的函数Function()  
函数方法   apply     调用函数自身,以(类)数组方式接受参数  

这三个方法主要作用是动态绑定函数内部属性this

1、apply和call在绑定之后会马上执行

2、bind在绑定之后可以在需要的时候再调用执行

 
call     调用函数自身,以列举方式接受参数  
bind     绑定函数作用域,ES5中新增  
toLocalString   覆盖  

覆盖了Object类型中的方法,返回函数体

不同浏览器实现返回可能不同,可能返回原始代码,也可能返回去掉注释后的代码

 
toString   覆盖  
valueOf   覆盖  
hasOwnProperty     直接继承自Object类型的方法,用法同Object  
propertyIsEnumerable    
isPropertyOf    

  函数属性和方法,除了从Object继承而来的属性和方法,也包括函数本身特有的属性和方法,用的最多的方法自然就是上一小节说的apply()、call(),这两个方法都是用来设置函数内部属性this从而扩展函数作用域的,只不过apply()扩展函数作用域时是以(类)数组方式接受函数的参数,而call()扩展函数作用域时需要将函数参数一一列举出来传递,看下面的例子:

复制代码 代码如下:


function sum(){
  var total = 0,
  l = arguments.length ;

  for(; l; l--){
  total += arguments[l-1];
  }
  return total;
}

console.info(sum.apply(null,[1,2,3,4]));//10
console.info(sum.call(null,1,2,3,4));//10


不过需要强调的是:apply和call的主要作用还是在于扩展函数作用域。apply和call在扩展作用域时会马上调用函数,这使得应用中有了很大限制,因此在ES5中新增加了一个bind()函数,这个函数也用于扩展作用域,但是可以不用马上执行函数,它返回一个函数实例,将传入给它的第一个参数作为原函数的作用域。它的一个可能的实现如下:

复制代码 代码如下:


function bind(scope){
var that = this;
return function(){
that.apply(scope, arguments);
}
}
Function.prototype.bind = bind;


这里涉及了一个闭包的概念,明天再继续。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wddsgp.html