所以听起来你在创建全局变量时遇到了麻烦。
好的。
在 JavaScript 中创建全局变量比它应该的要容易。
你的问题是n
没有定义(duh)。您不能引用尚未定义的变量。但你可能在想,“这与使用var
??? 的版本有什么不同” 这是一个很好的问题。
JavaScript 做了一种叫做“提升”变量定义的事情。如果您在函数中定义变量,则该定义会隐式重定位到函数的顶部。所以当你写的时候:
var n = n || {};
真正发生的事情更接近于:
var n;
n = n || {};
然而,这并不是那么简单,因为如果您尝试编写该代码,您最终会n
始终设置为{}
. 但是一般的本质是存在的。变量声明发生在赋值之前。
如果您删除var
,它将导致引用错误,因为不再有要提升的声明。因此,一种“适当的”(我松散地使用该术语,因为创建全局变量从来都不是“适当的”)做你想做的事情的方法是将你的var
并将它放在你的函数包装器之外。像这样:
var n = n || {};
(function () {
//do stuff.
}());
不幸的是,你不能这样做:
var n;
(function () {
n = n || {};
}());
这与我上面的示例具有相同的“问题”。如果n
在别处定义,它将被设置为undefined
,var n;
然后{}
在函数中设置为。通过在函数之外进行整个声明和赋值,您将获得所需的内容。我假设(根据您的问题的标题)实际上是命名空间,而不是一些任意的全局变量。那会很淘气!;-)
更新:
哦,顺便说一句,更好的方法可能是显式引用全局对象:
(function (exports) {
exports.n = exports.n || {};
}(this));
这可能会与 node.js 之类的东西和任何可能包装你的代码的东西(比如 a $(function() { })
)一起玩得更好。