Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 确定a'的范围;显示模块模式';带有jQuery的模块_Javascript_Jquery_Scope_Module Pattern_Revealing Module Pattern - Fatal编程技术网

Javascript 确定a'的范围;显示模块模式';带有jQuery的模块

Javascript 确定a'的范围;显示模块模式';带有jQuery的模块,javascript,jquery,scope,module-pattern,revealing-module-pattern,Javascript,Jquery,Scope,Module Pattern,Revealing Module Pattern,假设我有这个模块,我想让它自我初始化并附加到它的作用域。像这样: (function( scope ) { var Module = (function() { return { init: function(){ console.log('Initialized'); } }; })(); var module = scope.Module = Module; modul

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

(function( scope ) {
    var Module = (function() {
      return {
          init: function(){
              console.log('Initialized');
          }
      };
    })();
    var module = scope.Module = Module;
    module.init();
})( self );
现在,问题是,
self
始终是
窗口。我不想那样。我希望它是jQuery的
$.getScript()
调用和加载它的范围,如下所示:

var Master = (function($) {
    return {
        init: function() { 
            var self = this;
            $.getScript("/js/libs/module.js");
        }
    }
})(jQuery)

有没有办法破解这个问题?

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

})();

在这种情况下,作用域是模块,而不是窗口

我认为不能将作用域注入到使用$.getScript调用的自动执行脚本中。相反,您必须使用某种导出变量来存储脚本,直到可以注入范围为止

(function( exports ) {
   exports.Module = function() {
     return {
        init: function(scope){
           console.log('Initialized', scope);
        }
     };
   };
   var module = exports.Module;
})( exports || window.exports = {} );
然后:


诚实地说,如果你使用jQuery为这样的模块模式,考虑使用一个更全面的库加载器,比如OR../P>,在这个问题上不会有什么变化。代码>自我

是预定义的,并引用
窗口
对象。因此,由于他加载并执行另一个.js文件,
self
references
window
@jAndy,我想我没有正确理解他的问题,顺便说一句,require.js非常适合这个问题。谢谢
var self = this; // or whatever you want the scope to be
$.getScript("/js/libs/module.js", function(){
    exports.Module().init(self);
});