Привязка 'this' в цикле массива - PullRequest
2 голосов
/ 21 февраля 2011

У меня есть функция Javascript с пространством имен, и я использую Prototype для выполнения функции.Пример кода:

GUI.Title = {
 initialise: function() {
  var elements = $$('a');

  this.show(); /* now it refers to the namespace */

  elements.each(function(element) {
   this.show(); /* this refers to the window object, not to the namespace */
  });

},
 show: function() {
  element.show();
 }
}

'this' относится к пространству имен вне каждой функции, а внутри каждой относится к окну.

Может кто-нибудь объяснить мне, как я могу использоватьэто 'в каждом цикле в качестве ссылки на пространство имен?

Я использую Prototype.

Ответы [ 2 ]

11 голосов
/ 21 февраля 2011

Используйте метод Prototype bind, чтобы изменить значение this внутри функции.

elements.each(function(element) {
   this.show();
}.bind(this));
7 голосов
/ 21 февраля 2011

замените

this.show(); /* now it refers to the namespace */

elements.each(function(element) {
   this.show(); /* this refers to the window object, not to the namespace */
});

на

var scope = this;
elements.each(function(element) {
   scope.show(); /* this refers to the window object, not to the namespace */
});

, что вы делаете, это создаете замыкание, переменная 'scope' var 'закрывает каждую вашу функцию лексически.Обратите внимание, что этот подход не специфичен для прототипа, это общая техника javascript.

...