Как получить доступ к этому члену класса из-за обратного вызова? - PullRequest
4 голосов
/ 03 января 2011

Этот вопрос лучше всего объяснить с помощью некоторого кода, поэтому вот он:

// a class
function a_class {
    this.a_var      = null;
    this.a_function = a_class_a_function;
}

// a_class::a_function
function a_class_a_function() {
    AFunctionThatTakesACallback(function() {
        // How to access this.a_var?
    });
}

// An instance
var instance = new a_class();
instance.a_function();

Из обратного вызова в AFunctionThatTakesACallback() как получить доступ к this.a_var?

Ответы [ 3 ]

7 голосов
/ 03 января 2011

Вам нужно будет расширить область действия this, создав локальную переменную, которая ссылается на нее, например:

function a_class_a_function() {
   var self = this;
   AFunctionThatTakesACallback(function() {
      console.log(self.a_var); 
   });
}

Причина, по которой вам нужно это сделать, заключается в том, что ссылка this в функции AFunctionThatTakesACallback не совпадает с this с текущим объектом, скорее всего она будет ссылаться на глобальный объект window. (обычно не то, что вы хотите).

О, я упоминал, что это называется замыканием ?

0 голосов
/ 03 января 2011

Когда вы звоните instance.a_function(), вы действительно звоните a_class_a_function с instance как this, поэтому вы можете изменить a_class_a_function следующим образом:

function a_class_a_function() {
    var self = this;
    AFunctionThatTakesACallback(function() {
        // do something with self.a_var
    });
}

Проблема здесьчто если вы попытаетесь вызвать a_class_a_function без вызова его из экземпляра, то this, скорее всего, будет ссылаться на глобальный объект, window.

0 голосов
/ 03 января 2011

Вы можете попробовать использовать метод call для объектов функций, который позволяет вам указать значение для этого:

myFunction.call(this, args...)

Но я думаю, что в этом случае, вероятно, было бы более простым передать 'this' в качестве одного из параметров обратного вызова.

...