人們常說以上這三個是矯正this指向的列林,但是初次遇到它的人難免有點傻傻分不清楚瑞你,其實你需要的是三個足夠簡單精準的例子來做說明。
- here we go---apply()
function sum(num1,num2){
return num1+num2;
}
function callSum1(num1,num2){
return sum.apply(this,arguments); //傳入arguments參數(shù)
}
function callSam2(num1,num2){
return sum.apply(this,[num1,num2]); //傳入數(shù)組
}
alert(callSam1)(10,10); //20
alert(callSam2))10,10); //20
因為當前是在window環(huán)境調(diào)用的所以這個this傳入的就是window對象希痴。
- call()
function sum(num1,num2){
return num1+num2;
}
function callSum(num1,num2){
return sum.call(this,num1,num2);
}
alert(callSum(10,10)); //20
在使用call()方法時者甲,callSum()必須明確傳入每一個參數(shù)。結果與使用apply()沒什么不同砌创,至于是使用apply()還是call(),完全取決于你采取哪種給函數(shù)傳遞參數(shù)的方式更方便虏缸。如果你打算直接傳入arguments對象,或者包含函數(shù)中先接受到的也是一組數(shù)組嫩实,那么使用apply()肯定更方便刽辙;否則,選擇call()可能更合適甲献。(再不給函數(shù)傳遞參數(shù)的情況下宰缤,使用哪個方法都無所謂)
事實上,傳遞參數(shù)并非apply()和call()真正的用武之地晃洒;他們真正強大的地方是能夠擴充函數(shù)賴以運行的作用域.例子來看慨灭。
window.color="red";
var o = {color:"blue"};
function sayColor(){
alert(this.color)
}
sayColor(); //red;
sayColor.call(this); //red;
sayColor.call(window); //red;
sayColor.call(o); //blue;函數(shù)的執(zhí)行函數(shù)不一樣了,因為此時函數(shù)體內(nèi)的this指向 了o球及,所以是“blue”
- bind()
window.color="red";
var o = {color:"blue"};
function sauColor(){
alert(this.color);
}
var anotherSaycolor = saycolor.bind(o);
anotherSaycolor(); //blue