我最近重构了我的 JS 代码并偶然发现了这种模式:
APP = (function() {
var x,y,z;
function foo() {}
function bar() {}
return {x:x, y:y, z:z, foo:foo: bar:bar};
})();
这样做的好处是它创建了非全局变量,函数可以访问APP
. 所以无需输入,等就APP.foo
可以访问x, y, z
, 和 bar 。也可以使用,等全局访问所有内容。您还可以嵌套它们:APP.bar()
APP.x
APP.bar()
APP.x
APP = (function() {
var x,y,z;
function foo() {}
function bar() {}
var WIDGETS = (function() {
var a,b,c;
function hello() {}
function world() {}
return {a:a, b:b, c:c, hello:hello, world:world};
})();
return {x:x, y:y, z:z, foo:foo: bar:bar, WIDGETS:WIDGETS};
})();
因此WIDGETS
可以访问 中的变量APP
,但反之亦然(APP.WIDGETS.hello
可以使用foo()
,但APP.foo
必须使用WIDGETS.hello()
)。
我尝试使用 ERB(我在 Rails 上)创建这种模式,但结果很混乱。所以我正在考虑为此编写一个小的源到源编译器——比如 CoffeeScript(具有 SASS 的最小差异/扩展语言哲学),它只是将一些函数编译为替代 javascript。
我只是想要一个速记。
例如,这将编译为我上面的第二个代码块:
//NAMESPACE is a magical function I compile down to the long version in the second code block
APP = NAMESPACE(function() {
var x,y,z;
function foo() {}
function bar() {}
var WIDGETS = NAMESPACE(function() {
var a,b,c;
function hello() {}
function world() {}
//**notice the missing return statement that I don't need to manage and map to my variables**
});
//**notice the missing return statement that I don't need to manage and map to my variables**
});
简单而小巧——这样您就不需要跟踪变量了。也想像这样分离命名空间(所以我可以将它拆分为多个文件):
APP = NAMESPACE(function() {
var x,y,z;
function foo() {}
function bar() {}
//**notice the missing return statement that I don't need to manage and map to my variables**
});
APP = NAMESPACE(function() {
var WIDGETS = NAMESPACE(function() {
var a,b,c;
function hello() {}
function world() {}
//**notice the missing return statement that I don't need to manage and map to my variables**
});
});
关于如何做到这一点的任何想法?我不确定一切,但我认为如果存在的话,我会更喜欢 Javascript。