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

Joe*_*M05 6 javascript syntax

我正在阅读Ben Cherry的" JavaScript Module Pattern:In-Depth ",他有一些我不太了解的示例代码.在" 交叉文件专用状态"标题下,有一些示例代码具有以下内容:

var _private = my._private = my._private || {}
Run Code Online (Sandbox Code Playgroud)

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

var _private = my._private || {}
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*ole 7

var _private = my._private = my._private || {}
Run Code Online (Sandbox Code Playgroud)

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

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

这种情况是一种延迟初始化.一个不太简洁的版本是:

if (!my._private) {
    my._private = {};
}
var _private = my._private;
Run Code Online (Sandbox Code Playgroud)

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