这可能是重复但我不知道如何搜索它。
为什么
var test = test || {};
工作,但
var test = testing || {};
抛出错误?在定义时,test
和testing
都未定义。
修改
抛出的错误是“参考错误:未定义测试”
答案 0 :(得分:3)
在不存在的意义下变量未定义的变量与保持值undefined
的变量之间存在差异。
在您的第一个示例中,您使用test
声明var
,以便在评估=
右侧的表达式时,变量test
存在,但其值为{ {1}}。
在你的第二个例子中,你根本没有定义undefined
,因此错误。
为了简化,JavaScript引擎需要两次通过代码。第一遍是解析/编译阶段,然后是变量声明而不是赋值。第二遍是实际执行,然后发生分配。这导致了一种通常被称为“变量提升”的效果 - 就好像JS引擎将声明“提升”到其范围的顶部但仍然进行了分配。
关于这样的代码点:
testing
...它基本上是说“var test = test || {};
是否已经存在真值?如果是,请使用它,否则将其设置为新的空对象。”
JS引擎不介意在同一范围内多次声明同一个变量 - 它基本上忽略了第二个声明但不忽略任何赋值包含在第二个声明中。因此,如果在某个其他脚本块中声明test
,也许在单独的JS包含文件中,那么所讨论的行只会将test
赋给自己(假设它具有真值,其中所有对象都是真实的)。但如果它尚未在其他地方声明,它仍然会因当前test
语句而存在,但在当前分配之前它将为var
,因此undefined
运算符将返回右侧 - 操作数,||
。
答案 1 :(得分:1)
这是由var
关键字引起的。
因为声明了变量,所以它也存在,尽管值未定义。然后||
做的是检查真实性,当它发现对象未定义时,它会为你提供一个新对象。
后者完全相同,但由于你在“一行”上执行它,testing
对象在评估时没有被定义,因此会抛出异常。
答案 2 :(得分:1)
var test = test || {};
此处,test
已declared
但未defined
但在,
var test = testing || {};
没有任何testing
的引用,您仍在尝试分配其值。
第一种情况的相应代码是,
var testing; // See testing is still undefined
var test = testing || {};