如何为每个对象获取setInterval?

时间:2015-05-06 17:42:55

标签: javascript setinterval

Subj

我有javascript代码,例如

var User = function(data){
  this.name = data.name;
  this.delay = data.delay;
  this.say();
}

User.prototype.say = function(){
  _self = this;
  setInterval(function(){
    console.log(_self.name);
  }, this.delay * 1000);
}



var u1 = new User({name: "user1", delay: 10});
var u2 = new User({name: "user2", delay: 15});

u1和u2对象返回 user2

如何将 user1 返回10秒并将 user2 返回15秒?

3 个答案:

答案 0 :(得分:3)

这是因为闭包的工作方式。您没有为每个_self创建setInterval的新副本,因为该变量位于全局范围内,因此创建的最后一个副本将覆盖第一个值。

试试这个:

var User = function(data){
  this.name = data.name;
  this.delay = data.delay;
  this.say();
}

User.prototype.say = function(){
  var _self = this;
    setInterval(function(){
      console.log(_self.name);
  }, this.delay * 1000);
}

var u1 = new User({name: "user1", delay: 10});
var u2 = new User({name: "user2", delay: 15});

对匿名函数的每次调用都会创建一个新的局部作用域,这对于在其中创建的每个闭包都是新的,因此,当您添加{{1}时,每个作用域都有_self的自身值。在它之前。

考虑查看Bind()的文档。

答案 1 :(得分:1)

看起来setInterval函数正在使用_self的缓存版本。试着这样做:

 var _self = this;

答案 2 :(得分:1)

不要使用全局变量。将_self设为本地:

var _self = ...;