测试变量存在的 Javascript 多重赋值 : var obj = obj = obj || {}

标签 javascript namespaces overriding variable-assignment

在 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/

相关文章:

javascript - 使用 jQuery 在 DIV 中包装两个 HTML 元素

java - 我可以使用 JAXB 将所有 namespace 定义放入顶级元素吗

java - 实现接口(interface)的方法是否在java中被覆盖

asp.net - 全局覆盖 Page_PreInit() 而不子类化 Page?

javascript - Bootstrap 将文本框值添加到列表

javascript - 用户离开页面后运行去抖函数

javascript - JS,jQuery 冲突..帮助?

c++ - 命名空间内的局部函数声明

c++ - C++ 命名空间中的内联函数

java - 使用不需要的父类(super class)参数覆盖方法