name = name || {}
抛出引用错误,而var name = name || {}
有效。 javascript变量初始化如何工作?
答案 0 :(得分:2)
第二个代码因JavaScript提升而起作用。
当你有
时var name = name || {}
它被安排为
//moved to to top of scope
var name;
//point where you initialize it
name = name || {};
因此,当您初始化名称时,它已经被声明并且值为undefined
。第一个代码没有声明名称。
答案 1 :(得分:2)
该行
var name = name || {};
真的解释如下:
// Upon entry to the scope
var name;
// Later, in step-by-step code
name = name || {}
自宣布name
以来,您可以安全地获取其价值(在name
右侧有=
)。此时它的值为undefined
,因此name = name || {}
会将{}
分配给它。
这里有很大的不同:
name = name || {}
...是您没有name
的任何声明,因此在评估该指派的右侧时不存在。 The Horror of Implicit Globals允许您通过分配创建全局变量,但不允许您读取不存在的变量的值(但是)。
这就是为什么var
的版本有效且版本没有抛出ReferenceError
的原因。
旁注:我建议不要依赖隐式全局变量的恐怖。相反,总是声明你的变量(尽可能避免使用全局变量)。您可以使用JavaScript的“严格模式”将隐式全局变量的恐怖变为ReferenceError
(例如,写入未知符号会变成错误而不是创建全局变量,就像读取它一样)。
答案 2 :(得分:0)
name = name || {}
说"我已经有一个名为name
的变量,将其设置为name
或{}
。问题是你不已经有一个名为name的变量。因此,当它跳过以查看应该设置的内容时,它会认为" aha,name
...哦等等,它没有设置"和错误。
var name = ...
首先创建变量,然后开始查看它应该是什么,所以当它评估值时,它会说" aha,name
... i刚刚做到了,它没有定义。这是假的,所以它是{}
"。
还有另外两种常见情况。
function a(name) { name = name || 'Joe'; }
如果name
未传入(例如a()
),则默认为Joe。在这种情况下,变量已经由函数定义定义,因此您不需要var
。
defaults = { name: 'Joe' };
options = {};
// Later on
options.name = options.name || defaults.name;
答案 3 :(得分:0)
使用var
javascript时,在范围的开头定义所有可变数据。
这被称为可变悬挂。
例如,如果您有此代码:
function doStuff() {
for (var i = 0; i < arr.lenght; i++)
var currentItem = arr[i]
var doSomething = function(currentItem) { ... }
}
}
javascript执行此代码:
function doStuff() {
var i,
currentItem,
doSomething;
for (i = 0; i < arr.lenght; i++) {
currentItem = arr[i]
doSomething = function(currentItem) {...}
}
}