ECMAScript中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性:ength和prototype。
其中, length属性表示函数希望接收的命名参数的个数 .
function box1(name,sex){
return name+sex;
}
alert(box1.length);
PS: 对于prototype属性, 它是保存所有实例方法的真正所在, 也就是原型。 这个属性,我们将在面向对象一章详细介绍。 而prototype下有两个方法: apply()和call(), 每个函数都
包含这两个非继承而来的方法。这两个方法的用途都在特定的作用域中调用函数, 实际上等于设置函数体内this对象的值 .
function box(num1,num2){
return num1+num2;//原函数
}
function sayBox(num1,num2){
return box.apply(this,[num1,num2]);//this表示作用域,这里是window
//[]表示box所需要的参数
}
function sayBox1(num1,num2){
return box.apply(this,arguments);//arguments对象表示box所需要的参数
}
alert(sayBox(10,20)); //30
alert(sayBox1(10,15)); //25
call()方法于 apply()方法相同, 他们的区别仅仅在于接收参数的方式不同。 对于 call()方法而言,第一个参数是作用域,没有变化,变化只是其余的参数都是直接传递给函数的 .
function box(num1,num2){
return num1+num2;//原函数
}
function sayBox(num1,num2){
return box.call(this,num1,num2);//和 apply区别在于后面的传参
}
alert(sayBox(10,20)); //30
事实上,传递参数并不是 apply()和 call()方法真正的用武之地;它们经常使用的地方是能够扩展函数赖以运行的作用域 。
var color="red";
var box={
color:"green"
};
function test(){
alert(this.color);
}
test();//作用域在 window,输出为'red';
test.call(window);//作用域在 window,输出为'red';
test.call(this);//作用域在 window,输出为'red';
test.call(box);//作用域在box,对象冒充,输出为'green';
使用 call()或者 apply()来扩充作用域的最大好处,就是对象不需要与方法发生任何耦合关系(耦合,就是互相关联的意思,扩展和维护会发生连锁反应)。也就是说, box对象和sayColor()方法之间不会有多余的关联操作,比如 box.sayColor = sayColor 。