Я работаю над плагином jQuery. Когда плагин запускается, первое, что он делает, это определить его настройки. Он делает это, принимая некоторые настройки по умолчанию и переопределяя некоторые или все из них тем, что передал пользователь.
Здесь упрощенная версия:
(function( $ ) {
$.fn.somePlugin = function(userOptions) {
// Short name for internal use - exposed below for external modification
var defaults = $.fn.somePlugin.defaults;
// Decide settings
// User settings overrule defaults, but merge both into an empty
// hash so that original defaults hash isn't modified
var settings = $.extend(true, {}, defaults, userOptions);
settings.alerter.call();
// More code, etc.
}
$.fn.somePlugin.defaults = {
name: 'Captain Slappy von Martinez, Esquire, DDS',
favoriteColor: 'red',
alerter: function(){alert("I got bones!");}
}
})( jQuery );
Итак, если вы вызываете плагин следующим образом:
$('div').somePlugin({alerter: function(){alert('No bones here!');}});
... вы переопределите функцию по умолчанию alerter
, но используйте значение по умолчанию favoriteColor
.
Я определяю значения по умолчанию вне самого модуля, чтобы они были общедоступны. Поэтому, если вы хотите изменить значение по умолчанию для favoriteColor
, вы можете просто сделать это:
$.fn.somePlugin.defaults.favoriteColor = 'blue';
... и это изменит его для каждого экземпляра страницы после этого.
Все это прекрасно работает.
Здесь моя проблема: в одной из функций по умолчанию мне нужно обратиться к settings
. Что-то вроде этого:
$.fn.somePlugin.defaults = {
name: 'Captain Slappy von Martinez, Esquire, DDS',
favoriteColor: 'red',
alerter: function(){alert("Paint me " + settings.favoriteColor);}
}
Но когда я пытаюсь это сделать, я получаю ошибку Javascript в строке, где объявлена функция повторного использования по умолчанию: "настройки не определены". Достаточно: он еще не определен, когда парсер попадает в эту строку. Он будет определяться временем выполнения функции, но это не имеет значения.
Итак, мой вопрос: Как импортировать функцию по умолчанию в плагин таким образом, чтобы он имел доступ к settings
?
- Есть ли способ отложить оценку
settings
до тех пор, пока функция не будет вызвана? - Если да, есть ли способ убедиться, что он имеет доступ к локальной области плагина, хотя я предполагаю, что в качестве объекта эта функция передается по ссылке? Я знаю, что я могу изменить значение
this
внутри функции с помощьюsomeFunction.call(valueToUseForThis)
, но я не знаю, могу ли я изменить его область действия после факта.
Некоторый материал, который не работает
- Поначалу казалось, что если я объявляю
settings
во внешней, самоисполняемой функции, это сделает ее доступной по умолчанию. Но объявление его там вызывает проблемы: если я использую свой плагин несколько раз на странице, экземпляры перепутают их настройки.