使用jQuery确定“揭示模块模式”模块的范围

3

假设我有这个模块,我希望它能够自初始化并附加到它的作用域。像这样:

(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个回答

3
我认为你不能向使用 $.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.jsFrame.js

顺便说一下,require.js非常适合这个任务。谢谢。 - Kriem

0

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();

})();

在这种情况下,范围是模块,而不是窗口。

1
在这个问题上没有任何变化。self是预定义的并引用了window对象。因此,由于他加载和执行另一个.js文件,self引用了window - jAndy
@jAndy 我想我没有正确理解他的问题。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接