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秒?
答案 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 = ...;