函数的属性和方法
JS中的函数是对象,因此函数也有属性和方法。
每个函数都包含两个属性:length和prototype。
length属性,表示函数希望接收的命名参数的个数。
prototype属性,是保存它们所有实例方法的真正所在。
在ECMAScript5中,prototype属性是不可枚举的。
每个函数都拥有两个非继承而来的方法:apply()和call()。
这两个方法的用途都是在特定的作用域中调用函数;实际上等于设置函数体内this对象的值。
apply()方法接收两个参数:一个是在其中运行函数的作用域;另一个是参数数组(可以是Array实例,也可以是arguments对象)。
call()方法接收两个参数:一个是在其中运行函数的作用域;另一个是传递给函数的参数(必须逐一列举)。
apply()方法与call()方法的区别仅仅在于接收参数的方式不同。
apply()和call()真正强大的地方在于能够扩充函数赖以运行的作用域。
1 window.color = "red"; 2 var o = { 3 color : "green" 4 }; 5 function sayColor() { 6 console.log(this.color); 7 }; 8 sayColor(); //"red" 9 sayColor.call(this); //"red" 10 sayColor.call(window); //"red" 11 sayColor.call(o); //"green"
使用apply()和call()来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。
两个方法都允许显式地指定调用所需的this值,也就是说,任何函数都可以作为任何对象的方法来调用,哪怕这个函数根本不是那个对象的方法。
ECMAScript5中还定义了一个方法:bind();这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。
例如:
1 window.color = "red"; 2 var o = { 3 color : "green" 4 }; 5 function sayColor() { 6 console.log(this.color); 7 }; 8 var x = sayColor.bind(o); 9 x(); //"green"
原文:http://www.cnblogs.com/cc156676/p/5721756.html