這兩個方法的用途都是在特定的作用域中調用函數,實際上等於設置函數體內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,本身就是瀏覽器中的對象,所以在命令行窗口下測試是不能得到書中的結果的.
瀏覽器下測試結果: