Javascript模块模式-失去此范围
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Javascript模块模式-失去此范围,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3682字,纯文字阅读大概需要6分钟。
内容图文
一段时间以来一直在开发js模块模式,以满足“某些网站”不断增长的需求.本质上,我只需要一种对脚本进行分组/封装的好方法,并且有时需要使用OO模式.
我有一个可以正常工作的结构,但是我对它的某些部分不满意…所以我正在对其进行重构.这是更新的模式:
(function (global) {
var M = {
VERSION : 1.0
};
global.M = M;
//jQ document.ready()
global.onload = function(){
console.log('M VERSION: %s', M.VERSION);
var main = new M.Main();
};
M.Main = function(){
var _class1;
var _class2;
var _class3;
function _init(){
_class1 = new M.Class('foo','baz');
console.log('_class1.param2 : %s', _class1.getParam() ); //works
_class2 = new M.OtherClass('faz','boo');
_class2.setParam('Boozaz');
console.log('_class2.param2 : %s', _class2.getParam() ); //works
_class3 = new M.Class('fuz','boz')
console.log('_class3.param2 : %s', _class3.getParam() ); //works
_class3.prototype = new M.Super();
console.log('_class3.__param : %s', _class3.prototype.getProtected() ) //works
}
_init();
return true;
};
M.Super = function(){
var __param = 'jQ';
M.Super.API = {
getProtected : function(){ return __param }
}
return M.Super.API;
}
M.Class = function( p1, p2){
var _param1;
var _param2;
function _init(){
_param1 = p1;
_param2 = p2;
}
function _getParam(){
return _param2;
}
function _setParam(e){
_param2 = e;
}
M.Class.API = {
getParam : function(){ return _getParam(); },
setParam : function(e){ _setParam(e) },
publicMethod : function(){ ... }
}
publicMethod() //fails
this.publicMethod() //fails, this scopes to DOM window
M.Class.API.publicMethod() // works, but is kludgy
_init();
return M.Class.API;
};
})(typeof window === 'undefined' ? this : window);
这样会产生令人满意的DOM结构(通过Firebug进行检查)-但我在一个特定区域中失去了这种结构的范围=在内部调用返回对象的“公共”方法.
publicMethod() //fails
this.publicMethod() //fails, this scopes to DOM window
M.Class.API.publicMethod() // works, but kludgy syntax
在此模式的上一个迭代中,“类”对象是自执行的,并保留对此的引用:
M.Class = function( p1, p2){
var _param1;
var _param2;
var _root;
function _init(){
_root = this; //this gets referenced for later usage
_param1 = p1;
_param2 = p2;
}
function _getParam(){
return _param2;
}
function _setParam(e){
_param2 = e;
}
M.Class.API = {
init : function(){ _init(); },
getParam : function(){ return _getParam(); },
setParam : function(e){ _setParam(e) },
}
console.log('getParam, internal :%s', _root.getParam() ) //success
return M.Class.API;
}();
M.Class.init();
但是,在重构模式中,我希望通过new实例化这些“类”,以获得对执行顺序的更多控制.
我已经阅读了很多关于js中词汇范围的相当头脑麻木的文章…但是没有得出任何结论.
如何在更新的模块模式中保持此范围?
解决方法:
这是每个人在编写库或模块时都会提出的哲学问题之一:函数应使用此名称还是变量名称引用容器对象?答案是:这取决于.
如果您知道将始终使用正确的值(例如原型上的方法)调用该函数,请使用此函数.但是,如果可以通过其他任何方式调用该函数,请使用变量名.如果您以后决定更改名称,这是一个非常简单的搜索和替换操作.调用myLib.utils.someFn比给我调用this.someFn清晰得多.而且,如果您觉得打字太多,可以随时恢复为var sF = myLib.utils.someFn并从那里继续.
编辑
要回答您的问题:
publicMethod() //fails
当前作用域中没有publicMethod标识符,它将失败.
this.publicMethod() //fails, this scopes to DOM window
如果调用是M.Class(),则这是对M的引用.如果要获取窗口,则将以其他方式调用该函数.
M.Class.API.publicMethod() // works, but is kludgy
因为那是您设置的方式.如果您不喜欢它,则以其他方式进行设置.
最后:
)(typeof window === 'undefined' ? this : window);
似乎是似乎在网络上泛滥的那些神秘咒语之一.什么目的?如果目的是将对全局对象的引用传递给函数,则:
)(this);
在任何地方都足够.上面的目的是确保函数具有对全局对象的引用,因为引用窗口可能会解析为其他对象.包含可能会或可能不会传入全局对象的逻辑似乎是一个后退的步骤.在哪种情况下,最好引用全局对象的(可能是重新分配的)窗口属性,而不是全局对象本身?
内容总结
以上是互联网集市为您收集整理的Javascript模块模式-失去此范围全部内容,希望文章能够帮你解决Javascript模块模式-失去此范围所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。