创建没有var关键字的全局变量时的意外行为

时间:2012-08-13 10:29:16

标签: javascript

这里我只是为我的应用程序创建一个全局命名空间,一切都按预期工作

var MYAPP = MYAPP || {} ; 

但如果我省略var关键字(我知道这不是正确的方法),javascript会抛出错误“ReferenceError:MYAPP2未定义”。

MYAPP2 = MYAPP2 || {};
只是出于好奇,有人可以在第二种情况下解释为什么javascript无法解析引用。

3 个答案:

答案 0 :(得分:2)

第一个版本不会产生错误,因为Javascript的变量提升使其等同于:

var MYAPP;            // declares, but leaves the value undefined / unchanged
MYAPP = MYAPP || {};  // creates, if the value was previously undefined

重要的是,此的声明部分不会覆盖已对变量进行的任何现有声明或作业。

这是允许在单个范围内重复使用此模式的原因。 MYAPP要么保留已有的值,要么初始化为空对象。

在第二种情况下,该声明步骤被有效省略。如果变量尚未声明(或者在范围中存在,即作为全局对象的属性),则会生成您看到的错误。

答案 1 :(得分:1)

var MYAPP = MYAPP || {}在当前范围(也称为执行上下文)中声明变量MYAPP。如果声明出现在函数中 - 声明了局部变量;如果它在全局范围内 - 声明全局变量。

MYAPP2 = MYAPP2 ||另一方面,{}仅仅是财产分配。它首先尝试针对范围链解决MYAPP2问题。如果它在该范围链中的任何位置找到它,它将执行赋值;如果它没有找到MYAPP2,那么它只会在全局对象(它是作用域链中的顶级对象)上创建x属性。

答案 2 :(得分:0)

var关键字声明您引用的立即变量

var a = a || {}; 

就像

var a; a = a || {};

在第二种情况下,您正在重新声明变量尚未声明。