之前做过这样的一道题就是问apply()与call()的区别。当时没能答出来,现在整理一下,希望以后有帮助。

   其实每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法用途都是在特定的作用域中调用函数,实际上等于设置函数体内的this对象的值。

   首先,apply()方法接收两个参数,一个是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是array的实例,也可以是arguments对象。

   call()方法与apply()方法的作用相同,他们的区别仅在于接受参数方式不同。对于call(),第一个参数没用变化都是运行函数的作用域,变化的都是其余参数都直接传递给函数。即传递给函数的参数必须逐个列出来。

   事实上,传递参数并非apply()与call()的真正用武之地,他们的真正强大的地方是能够扩充函数赖以运行的作用域。看个例子:

window.color="red";

var c={color:"blue"};


function sayColor(){

alert(this.color);

}

sayColor();    //red

sayColor.call(this);  //red

sayColor.call(window);  //red

sayColor.call(c);   //blue


最后,使用call()和apply()来扩充作用域的好处就是对象不需要与方法有任何的耦合关系。