首页 > js中setInterval与作用域

js中setInterval与作用域

var i=0;
var t={
  a:function(){
    this.timer=setInterval(this.b,30);
  },
  b:function(){
    if(i++<1){
      console.log(this);
    }
  }
};
t.a();

输出的是

[circular object global]

这是为什么

http://jsbin.com/inajes/3


上面说的对,补充下bind不一定全部兼容,用apply/call做实例会好一点

setInterval(this.b.apply(this), 30);


输出的内容来自console.log(this);

而此处的this自然是全局的this咯。

你把t.b作为参数传给了setInterval,传进去的就仅仅是t.b这个函数。也就是说相当于

var func = t.b;
setInterval(func, 30);

之后调用时也就相当于每30毫秒执行一次func();

那么this当然是未有指定的


如果你希望那个this指代的是t,那么就可以setInterval(this.b.bind(this), 30)


或者为了方便你理解原理,如果你希望this指代的是t,你可以

var func = function() { t.b(); }
setInterval(func, 30);
【热门文章】
【热门文章】