人们常说以上这三个是矫正this指向的,但是初次遇到它的人难免有点傻傻分不清楚,其实你需要的是三个足够简单精准的例子来做说明。
- here we go---apply()
function sum(num1,num2){
return num1+num2;
}
function callSum1(num1,num2){
return sum.apply(this,arguments); //传入arguments参数
}
function callSam2(num1,num2){
return sum.apply(this,[num1,num2]); //传入数组
}
alert(callSam1)(10,10); //20
alert(callSam2))10,10); //20
因为当前是在window环境调用的所以这个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()必须明确传入每一个参数。结果与使用apply()没什么不同,至于是使用apply()还是call(),完全取决于你采取哪种给函数传递参数的方式更方便。如果你打算直接传入arguments对象,或者包含函数中先接受到的也是一组数组,那么使用apply()肯定更方便;否则,选择call()可能更合适。(再不给函数传递参数的情况下,使用哪个方法都无所谓)
事实上,传递参数并非apply()和call()真正的用武之地;他们真正强大的地方是能够扩充函数赖以运行的作用域.例子来看。
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;函数的执行函数不一样了,因为此时函数体内的this指向 了o,所以是“blue”
- bind()
window.color="red";
var o = {color:"blue"};
function sauColor(){
alert(this.color);
}
var anotherSaycolor = saycolor.bind(o);
anotherSaycolor(); //blue