JS中call、apply、bind的区别

首先,为什么要使用call,apply,bind,原因是他们可以改变this指向

box.onclick = function(){

  function fn(){

    alert(this);   

  }   

  fn();

};

 我们原本以为这里面的this指向的是box,然而却是Window。一般我们这样解决:

box.onclick = function(){   

  var _this = this;   

  function fn(){     

    alert(_this);   

  }   

  fn();

};

将this保存下来。

还有一些情况,有时我们想让伪数组也能够调用数组的一些方法,这时call、apply、bind就派上用场了。 
我们先来解决第一个问题修复this指向。

box.onclick = function(){   

  function fn(){     

    console.log(this);   

  }   

  fn.call(this);

};

或者简写成

box.onclick = function(){   

  (function(){     

    console.log(this);   

  }.call(this)); //box

};

call和apply、bind都是用来改变this的指向的,但也有一些小小的差别。下面我们来看看它们的差别在哪:

function fn(a,b,c,d){   

  console.log(a,b,c,d);

}

  //call

  fn.call(null,1,2,3);

  //apply

  fn.apply(null,[1,2,3]);

  //bind

  var f = fn.bind(null,1,2,3); f(4);

  结果如下:   1 2 3 undefined

        1 2 3 undefined

        1 2 3 4

call就是挨个传值,apply传一个数组,bind也是挨个传值,但和call和apply还有一些不同,使用call和apply会直接执行这个函数,而bind并不直接执行,而是将绑定好的this重新返回一个新函数,什么时候调用由你自己决定。

猜你喜欢

转载自www.cnblogs.com/shiyujian/p/9431447.html