在setTimeout上使用apply / call而不是bind

时间:2015-05-12 12:02:25

标签: javascript asynchronous

我一直在使用异步函数

我终于避开var _this = this;并切换到实际使用call/apply。但是,这样做时,

/* inside instantiated obj */
setTimeout(function(){ 
  /* more code here */ 
}.apply(this), 0);

,没有启动错误,似乎工作。为什么?因为我最近注意到它是“错误的”,实际上应该是:

/* inside instantiated obj */
setTimeout(function(){ 
  /* more code here */ 
}.bind(this), 0);
  

bind()方法创建一个新函数,当被调用时,它具有它   此关键字设置为提供的值,具有给定的序列   调用新函数时提供的任何参数。

1 个答案:

答案 0 :(得分:3)

当您在函数对象上调用applycall方法时,会立即调用,只会将结果传递给setTimeout。< / p>

bind返回一个新的函数对象,并在超时结束后调用。

由于超时设置为0,setTimeout s只等待0毫秒,因此您没有看到任何差异。

您可以使用此示例更好地理解它。

console.log(new Date());

setTimeout(function () {
    console.log("Apply", new Date());
}.apply(this), 3000);

setTimeout(function () {
    console.log("Bind", new Date());
}.bind(this), 3000);

你应该能够观察到Bind和其他两个之间3秒的差异。