Определение области действия модуля "Выявление шаблона модуля" с помощью jQuery
Скажем, у меня есть этот модуль, и я хочу, чтобы он самостоятельно инициализировался и прикрепился к его области. Вот так:
(function( scope ) {
var Module = (function() {
return {
init: function(){
console.log('Initialized');
}
};
})();
var module = scope.Module = Module;
module.init();
})( self );
Теперь проблема в том, что self
всегда window
, Я не хочу этого Я хочу, чтобы это было областью, где он был вызван и загружен в JQuery $.getScript()
, вот так:
var Master = (function($) {
return {
init: function() {
var self = this;
$.getScript("/js/libs/module.js");
}
}
})(jQuery)
Есть ли способ взломать это?
2 ответа
Я не думаю, что вы можете внедрить область видимости в самодействующий скрипт, вызываемый с помощью $.getScript. Вместо этого вы должны использовать какую-то переменную экспорта для хранения скрипта, пока область не будет введена.
(function( exports ) {
exports.Module = function() {
return {
init: function(scope){
console.log('Initialized', scope);
}
};
};
var module = exports.Module;
})( exports || window.exports = {} );
Затем:
var self = this; // or whatever you want the scope to be
$.getScript("/js/libs/module.js", function(){
exports.Module().init(self);
});
Честно говоря, если вы используете jQuery для такого шаблона модуля, рассмотрите возможность использования более полного загрузчика библиотеки, такого как require.js или Frame.js.
Область видимости в JavaScript тесно связана с функциями, а не объектами. Объект в JS {}
не создает свою собственную сферу. Я не знаком с "раскрытием шаблона модуля" в jQuery, но чтобы получить уникальную область видимости, вы должны сделать что-то вроде этого:
(function( scope ) {
var Module = (function() {
return new function() {
this.init = function(){
console.log('Initialized');
}
};
})();
var module = scope.Module = Module;
module.init();
})();
Или, может быть, более кратко:
(function( scope ) {
var Module = new function() {
this.init = function(){
console.log('Initialized');
};
};
var module = scope.Module = Module;
module.init();
})();
В этом случае область действия - Модуль, а не окно.