【发布时间】:2015-07-10 11:21:55
【问题描述】:
我理解为什么命名空间是好的 - 以防止过多的全局定义并防止代码被覆盖,但我正在尝试进一步挖掘以下语法:
// not safe, if there's another object with this name we will overwrite it
var MYAPPLICATION = {};
// We need to do a check before we create the namespace
if (typeof MYAPPLICATION === "undefined") {
var MYAPPLICATION = {};
}
// or a shorter version
var MAYAPPLICATION = MYAPPLICATION || {};
好的,第一行代码不安全,因为 MYAPPLICATION 可以在其他地方或由不同的库定义。
第二行检查它是否存在,如果它不继续,并使用新对象定义 var MYAPPLICATION。
我的问题是,如果事先定义了 MYAPPLICATION,会发生什么?代码不会初始化变量并且没有创建命名空间?这是否意味着您的代码将永远无法工作?如果是,那又是什么呢?
【问题讨论】:
-
如果
MYAPPLICATION变量已经启动,它将使用已经启动的变量:MYAPPLICATION = MYAPPLICATION。如果没有启动,它将创建一个新对象:|| {};。 -
那么,如果它使用的是别人创建的预先存在的,你的代码是不是有可能发生冲突?如果其他人定义了函数 foo(){return "bar"} 而我的代码定义了相同的函数 foo(){return "hello world"} 调用函数 foo() 时会发生什么?
-
@sjmartin 是的,事情有可能发生冲突。这就是为什么你应该使用一个相当独特的命名空间,而不用太担心它。
-
在那种情况下你可能会得到一个 TypeError 。您的命名空间应该是唯一的。你所有的函数和对象都应该属于那个命名空间。这限制了与其他库发生冲突的可能性。
-
这就是 require.js 存在的原因:避免污染全局命名空间并以合理的方式管理冲突。
标签: javascript namespaces