2015-08-17 4 views
0

Вот выдержка из моего кода:Потеря контекста этого в функции обратного вызова

'use strict' 
var VocabApp = function (element, options) { 
    this.options   = 
    this.$element   = null 
    ... 
    this.controlsHolder  = 
    this.test    = 
    this.init(element, options) 
} 
VocabApp.prototype.init = function (element, options) { 
     this.$element   = $(element) 
     this.options   = this.getOptions(options) 
     this.controlsHolder  = this.$element.find('nav.controls') 
     this.test    = 'foo' 
... 
} 
VocabApp.prototype.initUI = function() { 
    console.log(this.controlsHolder) 
    console.log(this.test) 
    this.$element.find('.levels').on('click', ".level", _.bind(function (e)   { 
      console.log(this.controlsHolder) 
      console.log(this.test) 
    }, this)) 
} 

Почему console.log первый распечатывают правильный элемент, а затем внутри функции обратного вызова печатает undefined? Должна ли _.bind сохранить контекст этого?

Странная деталь: this.test правильно печатает foo в обоих случаях!

Я также пробовал использовать $.proxy и var self = this безрезультатно.

Спасибо!

+0

Вы пытались отладить/вывести 'this' в веб-инспекторе (или консоли) из вашего обратного вызова? – Jack

+0

Я не вижу никакой декларации 'controlHolder' в' VocabApp' – Daniel

+0

Daniel, я только что обновил свой вопрос. –

ответ

1

Обратите внимание, что обратный вызов init меняет указанную переменную. $ Element.find ('nav.controls'), и конструктор также меняет эту переменную.

Я бы сказал, что либо конструктор, либо обратный вызов init запускают после initUI, изменяя тогда значение controlsHolder.

+0

Но this.test работает правильно! Тем не менее, он также устанавливается в обоих местах. –

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