Закрытия JavaScript и 'это'

34
задан 4 revs, 4 users 74%Chris 20 June 2015 в 06:19
поделиться

3 ответа

Когда функция вызвана, "это" относится к строке. Если Вы хотите иметь объект, можно сделать это что-то вроде этого:]

AddChildRowEvents: function(row, p2) {
    var theObj = this;
    if(document.attachEvent) {
         row.attachEvent('onclick', function(){theObj.DoSomething();});
    } else {
         row.addEventListener('click', function(){theObj.DoSomething();}, false);
    }
},

, Когда функция вызвана, она имеет доступ к переменной theOBj, который был в объеме, когда функция была определена.

36
ответ дан Mike Kantor 27 November 2019 в 16:55
поделиться

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

var myObject = {
    AddChildRowEvents: function(row, p2) {
        var that = this;
        if(document.attachEvent) {
            row.attachEvent('onclick', function(){that.DoSomething();});
        } else {
            row.addEventListener('click', function(){that.DoSomething();}, false);
        }
    }
}
10
ответ дан 3 revs 27 November 2019 в 16:55
поделиться

Это - распространенная проблема с закрытиями. Для разрешения это пробует что-то вроде этого:

var myObject = {    
    AddChildRowEvents: function(row, p2) { 
        var self = this;

        if(document.attachEvent) {            
             row.attachEvent('onclick', function(){this.DoSomething(self);});        
        } else {            
             row.addEventListener('click', function(){this.DoSomething(self);}, false);        
        }    
    },    

    DoSomething: function(self) {       
        self.SomethingElse(); 
    }
}
3
ответ дан 2 revs, 2 users 70%Chris Schick 27 November 2019 в 16:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: