функция, используемая в закрытии додзё javascript с использованием нотации this - PullRequest
2 голосов
/ 18 января 2011

У меня проблема с доступом к функции Object с использованием «this». В приведенном ниже примере (который упрощен, потому что я не могу предоставить фактический код по разным причинам), вызов функции this._getEntry () при вызове "undefined" createList ().

Я хотел бы надеяться на некоторые мнения о том, что это из-за неправильного понимания закрытие JavaScript или, скорее, синтаксическая ошибка.

В последнем случае мне придется найти ошибку в самом коде.

Если это неправильное понимание концепций javascript или dojo, я был бы очень признателен некоторая помощь по правильной настройке и доступу к указанной ниже функции (_getEntry ()).

var OBJECT = {
  _getEntry : function(entry){
    var li = document.createElement('LI');
    li.appendChild(document.createTextNode(entry));
    return li;
  },
  createList : function(entryArray){
    var list = document.createElement('UL');
    dojo.forEach(entryArray,function(entry){
      list.appendChild(this._getEntry(entry));
    });
    dojo.body().appendChild(list);
  }
};
OBJECT.createList(["entry1","entry2"]);

спасибо!

Ответы [ 2 ]

3 голосов
/ 18 января 2011

Во-первых, я думаю, что ваш вставленный код отсутствует ); для завершения forEach.

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

dojo.forEach(entryArray, function(entry){
  list.appendChild(this._getEntry(entry));
}, this);

Для получения дополнительной информации: http://dojotoolkit.org/api/dojo/forEach - который основан на API в JS 1.6 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach

2 голосов
/ 18 января 2011

Это распространенная проблема, и вы правы, все зависит от объема и закрытия. Что происходит здесь, когда вы попадаете в forEach, контекст меняется на глобальный контекст (window). Удобно, Dojo предоставляет способ установить этот контекст:

  createList : function(entryArray){
    var list = document.createElement('UL');
    dojo.forEach(entryArray,function(entry){
      list.appendChild(this._getEntry(entry));
    }, this);

    dojo.body().appendChild(list);
  }

Альтернативный подход заключается в использовании замыкания для достижения this

  createList : function(entryArray){
    var list = document.createElement('UL');
    var _this = this; // closure allowing the forEach callback access to this
                      // some popular variable names used for this include:
                      // $this, _this, me and that
    dojo.forEach(entryArray,function(entry){
      list.appendChild(_this._getEntry(entry));
    });

    dojo.body().appendChild(list);
  }
...