定时器中的this指向

2016-09-08  本文已影响215人  JasonQiao

先进一段JS代码

function aa(){
}
aa.prototype.init=function(){
  setTimeout(this.init,1000);
  console.log(1);
}
new aa().init();

问题来了:为什么这里的console.log(1)只有执行了两次?

第一次是首次调用函数时输出的,在第二次的时候 setTimeout 中的 this.init 由于脱离了 aa 类所以this的指向发生了变化(指向window或global),所以第二次的 setTimeout 是失败的,但是第二次的 console 是成功的。所以总共有两次。

如果想要一直循环的话可以使用 setTimeout(this.init.bind(this), 1000);将 this.init 中的 this 绑定到 aa 上就可以保证每次都能定位到是 aa.init 了。

function aa(){
}
aa.prototype.init=function(){
  var _this=this;
    setTimeout(function(){
      _this.init();
    },1000);
    console.log(2);
  }
new aa().init();

直接调用函数和setTimeout中隔0秒执行有什么区别

setTimeout的第二个参数如果省略则立即调用

上一篇下一篇

猜你喜欢

热点阅读