2015-05-06 8 views
-1

SubjКак получить setInterval для каждого объекта?

У меня есть код 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

Это происходит из-за того, как работают затворы. Вы не создаете новую копию _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}); 

Каждый вызов анонимной функции создает новую локальную область, которая является новой для каждого закрытия созданного в нем, и, таким образом, каждая сфера имеет свою ценность для _self при добавлении var перед этим.

Рассмотрите также документацию Bind().

+0

Ваше решение слишком сложно. Просто добавить 'var' достаточно. Да, проблема связана с закрытием, но актуальной проблемой является то, что '_self' является глобальным. –

+0

Да, LOL, извините, не уверен, что я думал - исправлено. –

1

Похоже, функция setInterval использует кешированную версию _self. Попробуйте сделать это:

var _self = this; 
1

Не использовать глобальные переменные. Марка _self местная:

var _self = ...; 
Смежные вопросы