apply()和call()的區別


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

                瀏覽器下測試結果:

                

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM