Вопрос о Mootools / области применения Javascript

#javascript #mootools #scope

#javascript #mootools #область применения

Вопрос:

Я пишу плагин Mootools и у меня проблемы с пониманием проблемы с областью видимости. Некоторый код для передачи моего контекста:

 var pluginName = new Class({
   implements: [ Options ],

  initialize: function(paramOne, options) {
    this.setOptions(options);
  },

  someFunction: function() {
    $$('menu').each(function(menu) {
      // SCOPE OF INTEREST
    });
  }
};
  

Мне интересно, есть ли способ получить доступ к объекту options в области, где я написал «ОБЛАСТЬ ИНТЕРЕСОВ». Я знаю, что одним из способов было бы установить переменную в начале какой-либо функции следующим образом:

 someFunction: function() {
    var optionIWantToAccess = this.options.relevantOption;
    $$('menu').each(function(menu) {
      // now optionIWantToAccess is available here
    });
  }
  

но это кажется немного неуклюжим и пахнет лучшей альтернативой. Более общая версия этого вопроса такова: могу ли я получить доступ к области видимости на уровне класса (не уверен, что это правильный термин …. но область видимости внутри функции инициализации — это то, о чем я говорю) внутри итератора Mootools?

Любая помощь по этому вопросу была бы высоко оценена.

Спасибо.

Ответ №1:

Вы можете привязать функцию к экземпляру.

 someFunction: function() {
  $$('menu').each(function(menu) {
    // 'this' is still the original instance
    this.options.relevantOption;
  }.bind(this))
}
  

Функция#bind недоступна в старых браузерах, но добавить для нее поддержку очень просто.

Комментарии:

1. пара вещей. mootools прототипирует функцию и добавляет bind , если она недоступна изначально. Во-вторых, Array.each принимает второй параметр после функции обратного вызова, т. Е. bind поэтому вы можете просто указать, array.each(fn() { this.something(); }, this); где this находится область, к которой вы привязываетесь, но это может быть все, что вам нужно, — какой самый чистый / наиболее читаемый способ сделать это

2. Кроме того, проверьте Binds mutator, который является более приятным / чистым способом привязки области видимости.

3. Спасибо, ребята!!!! (почему существует минимальная длина комментария, которая заставляет меня ставить 4 восклицательных знака после простого «спасибо»?)

4. @Oskar Krawczyk честно говоря, я больше не большой поклонник мутатора binds. Это увеличивает накладные расходы на код создания экземпляра класса и за счет включения mootools-больше (или, по крайней мере, Class.Binds ). Это также может быть трудно прочитать, поскольку легко пропустить объявление (в длинном классе) — простой просмотр соответствующего раздела кода может не иметь особого смысла — если вы не помните, что нужно смотреть на начало класса. Кроме того, существуют расширенные классы, которые могут быть даже в других файлах…