1

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

var MYAPP = MYAPP || {} ; 

但是如果我省略 var 关键字(我知道这不是正确的方法),javascript 会抛出错误 "ReferenceError: MYAPP2 is not defined" 。

MYAPP2 = MYAPP2 || {};

出于好奇,有人可以在第二种情况下向我解释为什么 javascript 无法解析引用。

4

3 回答 3

2

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

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

重要的是,这里的声明部分不会覆盖已经对变量进行的任何现有声明或赋值。

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

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

于 2012-08-13T10:38:20.163 回答
1

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

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

于 2012-08-13T10:37:08.863 回答
0

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

var a = a || {}; 

就像

var a; a = a || {};

在第二种情况下,您引用的变量尚未声明。

于 2012-08-13T10:41:15.613 回答