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;
这里涉及了一个闭包的概念,明天再继续。
您可能感兴趣的文章: