JavaScript命名空间和对象创建

时间:2012-09-14 18:14:08

标签: javascript object namespaces

我正在试图弄清楚为什么你可能会使用以下代码:

    var myObject = myObject || {};

我已经看过几次,但不明白为什么这是必要的。谢谢你的回复。

3 个答案:

答案 0 :(得分:4)

人们调用JavaScript的二进制文件或||默认运算符

var myObject = myObject || function(){};

相同
var myObject = myObject ? myObject : function(){};

以下代码

var AppSpace = AppSpace || {};
使用

是因为多个文件将设置并使用命名空间,并且如果已经创建了命名空间,则不希望覆盖该命名空间。这样,首先包含哪个文件并不重要。

这是另一个违约的例子。

function doSomething (callback)  {
   something();
   code();      
   callback = callback || function() {};
   // Now we can call the callback even if it wasn't passed in.
   callback();         
}

但是,请注意以下问题Why does IE nuke window.ABC variables?

即使用

定义了名称空间
window.AppSpace = {a: 1};

另一个文件集

var AppSpace = AppSpace || {}

在IE中,如果两个脚本位于不同的脚本标记中,它会将window.AppSpace的值覆盖为空对象,因为变量提升并且IE没有意识到window.a和{{顶层的1}}都指向同一个变量。

答案 1 :(得分:2)

function(){}是一个空类,因为类是JavaScript中的函数。这段代码特别利用了JavaScript中OR的早期退出 - 它评估了第一项,并将结果设置为等于如果它是真实的,如果它是假的则等于第二项。因此,如果myObject是真的(非空),myObject等于那个,如果不是那么它等于一个空函数。

基本上,这段代码所说的是“如果myObject已经存在,请将其保留在原位,并使其等于此空白函数”。

答案 2 :(得分:0)

这种技术被称为"短路"评价。

hort-circuit评估,最小评估或McCarthy评估表示某些编程语言中某些布尔运算符的语义,其中第二个参数仅在第一个参数不足以确定值的情况下执行或计算表达式:当AND函数的第一个参数求值为false时,整数值必须为false;当OR函数的第一个参数求值为true时,总值必须为true

http://en.wikipedia.org/wiki/Short-circuit_evaluation