這兩個方法的用途都是在特定的作用域中調用函數,實際上等於設置函數體內this對象的值.
apply()接收兩個參數:一個參數是在其中運行的作用域,另一個是參數數組(可以是Array實例,也可以是arguments對象).
實例:
function sum(num1,num2) {
return num1+num2;
}
function applySum1(num1,num2) {
return sum.apply(this,arguments);
}
function applySum2(num1,num2) {
return sum.apply(this,[num1,num2]);
}
console.log(applySum1(10,10));//20
console.log(applySum2(10,10));//20
call()方法,第一個參數和apply()一樣,是在其中運行的作用域即this;和apply()不同的是,call()方法中的其余的參數必須直接傳給函數,即在使用call()方法時參數必須逐個的列出來.
實例:
function sum(num1,num2) {
return num1+num2;
}
//function applySum1(num1,num2) {
// return sum.apply(this,arguments);
//
//}
//
//function applySum2(num1,num2) {
// return sum.apply(this,[num1,num2]);
//
//}
function callSum1(num1,num2) {
return sum.call(this,num1,num2);
}
console.log(callSum1(10,10));//20
apply和call的區別只是除了第一個this參數外,其余參數的傳遞方式不一樣,apply的其余的參數可以用Array實例和arguments對象傳遞,call的其余參數必須逐個列出.兩者最后得到的結果一樣.
apply和call真正的用處是擴充函數的作用域:
實例1:
//一般方法
color = "red";
var o = {color:"blue"};
function sayColor() {
console.log(this.color);
}
sayColor();//red
o.sayColor();//報錯
o.sayColor = sayColor;//給對象o添加一個sayColor方法,然后讓其指針指向全局作用域中的sayColor函數
o.sayColor();//blue
實例2(call方法和apply方法一樣效果):
color = "red";
var o = {color:"blue"};
function sayColor() {
console.log(this.color);
}
//sayColor();//red
//o.sayColor();//報錯
//o.sayColor = sayColor;//給對象o添加一個sayColor方法,然后讓其指針指向全局作用域中的sayColor函數
//o.sayColor();//blue
//采用apply或call方法解決對象和方法耦合的問題
sayColor.call();//red
sayColor.call(o);//blue
sayColor.call(this);//undefined
sayColor.call(window);//window is not defined
測試結果:

最后的測試結果和《javascript高級程序第3版》中的有點不一致(原因待分析):

8-16補充:全局對象window,本身就是瀏覽器中的對象,所以在命令行窗口下測試是不能得到書中的結果的.
瀏覽器下測試結果:

