在Ady Osmani关于js中命名空间的blog post中,他提到了5种常见的做法来测试先前定义的namepsace / object的存在以防止覆盖。我在这里复制了我关心的3个问题:
var myApplication = myApplication || {}; // option 1
...
var myApplication = myApplication = myApplication || {}; // option 3
myApplication || (myApplication = {}); // option 4
根据他的说法,选项3优于选项1,但我看不出2之间的区别。再做一次任务的好处是什么?
为什么选项4被认为是最佳做法?
答案 0 :(得分:1)
没有var
声明的任何选项都会在“严格”模式下导致异常(或者,正如评论中指出的那样,如果您在“严格”中不 “模式!)。因此,选项4,如书面所示,不是一种选择。
选项3与选项1无任何不同。选项1实际上与
相同var whatever;
whatever = whatever || {};
选项3实际上是:
var whatever;
whatever = whatever || {};
whatever = whatever;
所有情况下的var
声明(不初始化赋值)都被视为它出现在作用域的开头(在此上下文中是脚本单元)。如果符号已经声明(已经是window
的属性),则var
声明无效。
因此,var
声明至关重要。因为它被提升到代码的顶部,所以初始化表达式在var
以非破坏性的方式处理声明,所以可以引用=
运算符右侧的符号。
答案 1 :(得分:0)
如果已经分配了变量,则选项4不会进行任何分配。如果已经分配了变量,则其他选项会将变量分配给自身,因此在这种情况下,它们会执行不必要的分配。
我看不出选项3如何优于1。
答案 2 :(得分:-1)
选项4只是
的快捷方式if (!myApplication)
myApplication = {};
我认为这是最好的,因为它不做任何不必要的任务。
实际上,选项3对我来说有点傻。
在说明我认为它是 best (读取:最易阅读)的解决方案时,我正在考虑这样的事情:
function foo(bar) {
bar || (bar = {});
}
即使我可能会采取另一种方式:
function foo(bar) {
((typeof bar) === 'object') || (bar = {});
}