我发现了一行JavaScript代码,我不清楚它是如何工作的。让我们说window
对象之前没有设置任何app
属性:
var app = window.app || {};
问题是 - 为什么JS不会为app
对象的不存在的window
属性抛出任何ReferenceError,而是将window.app
创建为{}
- 为什么?如果我执行以下行:
var a = b || {}
我得到了ReferenceError: b is not defined
,我就可以了。另外,我理解xxx || {}
表达式 - 如果它不是假的话,它返回第一个元素,否则返回第二个元素。例如,使用空白对象初始化未定义的内容非常有用(例如,JS中的默认函数参数)。
答案 0 :(得分:3)
尝试使用未声明的变量时,您只会获得参考错误,永远不会出现未定义的属性。
如果左侧是真值,则 ||
返回左侧,否则返回右侧。
window.app
未定义,因此它是假值。因此它返回右侧:{}
。
然后将评估或声明的结果分配给app
。
如果app
是全局变量(即未在函数内声明),则将创建app
对象的属性window
。这不是在测试中使用window.app
的结果。这正是全局变量的工作原理。