2014-01-21 2 views
1

У меня есть класс JavaScript (function) с переменной this.foo и функция this.bar(), this.bar() Я вызываю интервал, но имею небольшую проблему, JavaScript забывает this.foo и я не могу использовать this.foo в this.bar(). Зачем?Javascript забывает эту переменную

function Somethink(element) { 
    this.foo = element; 

    this.bar = function() { 
      // And now this.foo is undefined 
    } 

    setInterval(this.bar, 1000) 
} 

ответ

3

потому что this - это область видимости окна, когда интервал пробегает. Вы должны использовать замыкание или bind()

window.setInterval(this.bar.bind(this), 1000); 
1
function Somethink(element) { 
    var foo = element; 

    var bar = function() { 

    } 

setInterval(bar, 1000) 
} 

использовать переменные вместо этого. «Это» меняет контекст в зависимости от того, где вы его назвали

0

Поведение верное. В то время, когда вызывается bar(), this может что угодно. Обычный обходной путь заключается в назначении this локальной переменной:

function Somethink(element) { 
    var that = this; // trick 
    that.foo = element; 

    that.bar = function() { 
      // Use "that" in here 
    } 

    setInterval(that.bar, 1000) 
} 

that будет убедиться, что код сохраняет ссылку на исходное значение this.

+0

@epascarello: Вы не правильно прочитали мой код. Оно работает. –

4

Это происходит потому, что setInterval вызывает this.bar в контексте глобального объекта, а не в контексте текущего объекта. Попробуйте назвать это таким образом:

var self = this; 
setInterval(function() { self.bar() }, 1000); 

Update Как уже было отмечено в комментариях, другой вариант заключается в использовании Bind()

setInterval(this.bar.bind(this), 1000); 
+1

Я согласен с дополнительным вариантом @epascarello. Намного проще просто использовать '.bind' ...' setInterval (self.bar.bind (this), 1000); ' –

+0

« Я »не требуется. этого.bar.bind (этого) было бы достаточно –

+0

да, я не хотел ставить туда xD. Я просто смотрел на себя в свой пост и набрал его случайно. Я имел в виду 'setInterval (this.bar.bind (this), 1000);'. Спасибо, что указали, что в глобальном объекте контекст будет вызываться –

-1

Вы можете сделать так:

function Somethink(element) { 
    this.foo = element; 

    this.bar = function() { 
     // And now this.foo is undefined 
    } 
    var self = this 

    setInterval(self.bar, 1000) 
} 
+0

«self.bar». –

Смежные вопросы