我刚刚看到有人window.Module = window.Module || {}
将(function(module){
// do something with module
})(window.Module = window.Module || {});
传递到函数中。
例如:
window.Module
我理解如果{}
未定义(或者错误),那么window.Module
会被传入,但设置if(!(window.Module = window.Module)) {
// pass {} into function
}
else {
// pass window.Module = window.Module into function
// (which makes NO sense to me)
}
等于自身的重点是什么?
对于发布答案的人:
我将代码读作:
{{1}}
答案 0 :(得分:6)
这一点做了两件事:
window.Module || {}
位使用JavaScript's curiously-powerful ||
operator来评估window.Module
(如果它是真实的)或{}
(如果window.Module
是假的)。 ||
评估其第一个非假名操作数。然后将结果分配给window.Module
。结果是如果 window.Module
是假的(可能是undefined
),则会为其分配{}
;如果它不是假的(它可能已经引用了一个对象),理论上它会被重新分配给自己,虽然在实践中引擎可能足够聪明,不会打扰死货。
然后它将赋值的结果(window.Module
中的值[now])传递给函数。
因此,最终结果是window.Module
被设置为一个新的空白对象(如果之前未设置),无论它是否在之前设置,window.Module
中的任何对象(现在)传递给函数。
答案 1 :(得分:2)
这就是为什么我不喜欢简单if
上的短路表达的原因。
使用传统结构表达:
if (!window.Module)
{
window.Module = {};
}
else
{
// this is a no-op, and the whole else clause could be removed.
window.Module = window.Module;
}
您不能在表达式中使用此结构,但它更具可读性。
分配window.Module
的主要原因是确保分配了window.Module || {}
。您可以简单地传递{{1}},但这会使其保持未初始化状态。
答案 2 :(得分:0)
(function(module){
// do something with module
})(window.Module = window.Module || {});
此代码首先确保设置了全局Module
对象,然后将其传递给函数。如果你遗漏了作业:
(function(module){
// do something with module
})(window.Module || {});
然后Module
将不会被设置(如果它在那时不存在)。当然,module
可用于访问对象,但函数内的某些代码可能需要Module
。
更好的模式可能是:
// global code
if (!iwindow.Module) window.Module = {};
(function () {
// use Module
}());