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