设置与自己相等的东西有什么意义?

时间:2014-01-02 17:46:17

标签: javascript variables parameters module-pattern

我刚刚看到有人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}}

3 个答案:

答案 0 :(得分:6)

这一点做了两件事:

  1. window.Module || {}位使用JavaScript's curiously-powerful || operator来评估window.Module(如果它是真实的)或{}(如果window.Module是假的)。 ||评估其第一个非假名操作数。然后将结果分配给window.Module。结果是如果 window.Module是假的(可能是undefined),则会为其分配{};如果它不是假的(它可能已经引用了一个对象),理论上它会被重新分配给自己,虽然在实践中引擎可能足够聪明,不会打扰死货。

  2. 然后它将赋值的结果(window.Module中的值[now])传递给函数。

  3. 因此,最终结果是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
}());