2012-03-08 2 views
1

Я только что перестроил свой код на объекты и использовал это ключевое слово, у меня есть эта проблема, в результате чего настройка prop работает, но затем, когда срабатывает второй метод, myProp не определен. Я заметил, что если я использую myObj, чтобы установить и получить, а не это, он отлично работает. В чем тут разница? Что я делаю не так? Я, хотя это имел в виду экземпляр, который есть только тот, который был автоматически создан экземпляром объекта.Почему я не могу получить доступ к this.property в моем объектном литерале?

var myObj = { 
    SetProp: function (id) { 
     this.myProp = "abc"; 
     Ajax.GetJSONAfterStandardLogic(Utility.PrefixURL("/ajax/mymethod"), this.SetPropSuccess); 
    }, 
    SetPropSuccess: function (response) { 
     console.log("test " + this.myProp); 
    } 
} 
+0

Поскольку 'this' относится к функции' SetPropSuccess' в этом контексте. –

+0

Возможный дубликат [Область действия этого «в JavaScript] (http://stackoverflow.com/questions/2253955/scope-of-this-in-javascript) <- их много, но это первый из них. натолкнулся на хорошо сформулированный ответ. –

ответ

1

Скорее всего потому, что при вызове этих функций, this не является объектом. this - это привязка, с которой вызывалась функция.

немного больше кода, чтобы продемонстрировать, как вы вызываете функция будет полезна, но вы можете сделать его работу с помощью:

myObj.SetProp.call(myObj, id) 

Это связывает myObj, как this, для вызова функции SetProp.

Если вы положили console.log(this) в любую из этих функций, вы, вероятно, обнаружите, что this не то, что вы ожидаете.

1

Когда функция обратного вызова выполнена, она находится в другом диапазоне. Поскольку такое «это» указывает, что область действия и ваш «myProp» не определены. Вот почему использование myObj.myProp работает - область действия остается в силе.

Приветствия

+0

'this' не задается по объему, он задается тем, как вызывается функция. – nnnnnn

1

this переменная устанавливается в соответствии с тем, как называется функцией. При использовании objectReference.method() синтаксис «точка» this будет автоматически установлен на объект. Вы также можете вызвать функцию и явно установить this на какой-либо другой объект, используя .call() или .apply().

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

var myObj = { 
    SetProp: function (id) { 
     var self = this; 
     this.myProp = "abc"; 
     Ajax.GetJSONAfterStandardLogic(Utility.PrefixURL("/ajax/mymethod"), 
             function() { self.SetPropSuccess(); }); 
    }, 
    SetPropSuccess: function (response) { 
     console.log("test " + this.myProp); 
    } 
} 

с помощью магии закрытия, анонимная функция, которую я добавил в качестве обратного вызова для передачи GetJSONAfterStandardLogic() имеет доступ к переменным в его содержащем объеме SetProp()даже послеSetProp()закончен исполнением.

Подводя итог, вы должны привыкнуть к this в JavaScript, работающем совсем по-другому, так, как он работает на языках OO на основе классов, таких как Java и C#. JavaScript по-прежнему OO, но эти различия обычно заставляют людей приходить на язык с Java или C#.

Дальнейшее чтение: https://developer.mozilla.org/en/JavaScript/Reference/Operators/this

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