为什么在此v​​ar声明中将此变量赋值给自身?

时间:2011-11-29 19:11:28

标签: javascript syntax

我正在阅读Ben Cherry的“JavaScript Module Pattern: In-Depth”,他有一些我不太了解的示例代码。在跨文件私有状态标题下,有一些示例代码具有以下内容:

var _private = my._private = my._private || {}

这与写下这样的东西似乎没有什么不同:

var _private = my._private || {}

这里发生了什么,这两个声明有何不同?

1 个答案:

答案 0 :(得分:7)

var _private = my._private = my._private || {}

此行表示使用my._private(如果存在),否则创建新对象并将其设置为my._private

可以在语句中使用多个赋值表达式。赋值运算符使用(消耗)其右侧的任何内容,并将该值作为其输出到所分配的变量的左侧。因此,在这种情况下,为了清楚起见,括号中的上述内容相当于var _private = (my._private = (my._private || {}))

此案例属于lazy initialization。一个不太简洁的版本是:

if (!my._private) {
    my._private = {};
}
var _private = my._private;

在这种情况下,似乎延迟初始化更多地用于任何地方的初始化而不是懒惰。换句话说,所有函数都可以包含此行来安全地创建或使用my._private而不会吹走现有的var。