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
referenceswindow
@jAndy,我想我没有正确理解他的问题,顺便说一句,require.js非常适合这个问题。谢谢
var self = this; // or whatever you want the scope to be
$.getScript("/js/libs/module.js", function(){
exports.Module().init(self);
});