在 Ady Osmani 的 blog post关于 js 中的命名空间,他提到了 5 个常见做法来测试先前定义的命名空间/对象是否存在以防止覆盖。我在这里复制我关注的 3 个:
var myApplication = myApplication || {}; // option 1
...
var myApplication = myApplication = myApplication || {}; // option 3
myApplication || (myApplication = {}); // option 4
根据他的说法,选项 3 比选项 1 好,但我看不出两者之间的区别。多做一项作业有什么好处?
另外,为什么选项 4 被认为是最佳实践?
最佳答案
任何没有 var
声明的选项都会在“严格”模式下导致异常(或者,正如评论中指出的那样,如果您不在“严格”模式下!)。因此,书面的选项 4 不是一个选项。
选项 3 在任何方面都与选项 1 没有区别。选项 1 实际上与
var whatever;
whatever = whatever || {};
选项 3 是有效的:
var whatever;
whatever = whatever || {};
whatever = whatever;
var
声明(不是 初始化赋值)在所有情况下都被视为出现在范围的开头(在此上下文中,脚本单元) .如果符号已经声明(已经是 window
的属性),则 var
声明无效。
因此,var
声明至关重要。因为它被提升到代码的顶部,所以在“whatever”未已定义的情况下,初始化表达式不会导致“ReferenceError”。因为 var
以非破坏性方式处理声明,所以可以引用 =
运算符右侧的符号。
关于测试变量存在的 Javascript 多重赋值 : var obj = obj = obj || {},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20427386/