2011-01-03 2 views
4

Этот вопрос лучше всего объяснить с некоторым кодом, так вот она:Как получить доступ к этому члену класса из-за обратного вызова?

// 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?

ответ

6

Вам необходимо расширить сферу this путем создания локальной переменной, которая ссылается на него, как это:

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

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

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

+1

Perfect. Это прекрасно работает ... и вы отлично справились с этой проблемой. –

+0

@ Джордж Эдисон Спасибо! Я ценю это! :) –

0

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

myFunction.call(this, args...) 

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

0

Когда вы звоните 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.