定时器中的this指向

先进一段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的第二个参数如果省略则立即调用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 使用js中的定时器(setInterval,setTimeout),很容易会遇到this指向的问题。例如:var ...
    指尖技术阅读 2,513评论 0 2
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,854评论 2 17
  • 在面向对象的语言中(例如Java,C#等),this含义是明确且具体的,即指向当前对象。一般在编译期绑定。而在ja...
    一木_qintb阅读 407评论 0 0
  • 大家好,我是IT修真院上海分院第1期的Web学员刘洪利,今天给大家分享一下Js中this的指向 1.背景介绍 JA...
    LHongLi阅读 1,648评论 0 1
  • 大家好,我是IT修真院北京分院第22期的学员杨纲,一枚正直纯洁善良的WEB前端程序员。 1.背景介绍 this对象...
    古碑先生阅读 526评论 0 1