#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
). Это также может быть трудно прочитать, поскольку легко пропустить объявление (в длинном классе) — простой просмотр соответствующего раздела кода может не иметь особого смысла — если вы не помните, что нужно смотреть на начало класса. Кроме того, существуют расширенные классы, которые могут быть даже в других файлах…