call、apply、bind看了必懂

2017-06-01  本文已影响0人  想个名字真难ing

人们常说以上这三个是矫正this指向的,但是初次遇到它的人难免有点傻傻分不清楚,其实你需要的是三个足够简单精准的例子来做说明。

 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对象。

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”
window.color="red";
var o = {color:"blue"};
function sauColor(){
     alert(this.color);
}
var anotherSaycolor = saycolor.bind(o);
anotherSaycolor(); //blue
上一篇 下一篇

猜你喜欢

热点阅读