Определение области действия модуля "Выявление шаблона модуля" с помощью 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();

})();

В этом случае область действия - Модуль, а не окно.

Другие вопросы по тегам