Javascript变量作用域未定义

Javascript变量作用域未定义,javascript,Javascript,如果尚未定义但发现一个奇怪的问题,我想将变量定义为默认值 var x=x |{}有效,而x=x |{}给出了一个错误 firebug的输出 >>> a = a || {}; ReferenceError: a is not defined [Break On This Error] a = a || {}; with(_... {}; }; (line 2) >>> var b = b || {}; undefined >>> b;

如果尚未定义但发现一个奇怪的问题,我想将变量定义为默认值

var x=x |{}
有效,而
x=x |{}
给出了一个错误

firebug的输出

>>> a = a || {};
ReferenceError: a is not defined
[Break On This Error]   
a = a || {};
with(_... {}; }; (line 2)
>>> var b = b || {};
undefined

>>> b;
Object {}
>>> a;
ReferenceError: a is not defined
[Break On This Error]   

为什么第一个给出错误,而第二个似乎通过。

只需使用
var
。除了旧IE版本上的一个bug之外,添加
var
将为您保存一条错误消息,并明确表明您没有假设它在其他地方声明

在那些旧版本的IE上

x = (typeof x !== 'undefined' && x) || {}

typeof
检查可防止出现“未声明变量”错误。

重复的?此答案将帮助您了解此问题是否存在真正的重复项,这些重复项不是其中之一。由于,
b
的定义被提升到范围的顶部,以便在赋值操作发生之前将
b
定义为局部变量。对于
a
,情况并非如此,因为它没有使用
var
定义。吊装演示(@apsillers):注意
z
从未定义过,但是
zz
在以后定义时,会在该检查中返回
uh-oh-zz
。如果您使用的是旧IE,那么它对该错误无效(在IE8兼容模式下出现错误)@Esailija,说得好。我假设某个地方有一个
var
,我所说的IE bug会导致当两个
元素中有
var
时,重新初始化为
undefined
。如果id/名称重叠,那么必须在某个地方有一个
var
。第一个是否会返回
true
to
x
?@JaredFarrish,no.
(a和b)
a
为真或
a
为假时返回
b
(a | | b)
a
为假或
a
为假时返回
b
。@Jared