这里我只是为我的应用程序创建一个全局命名空间,一切都按预期工作
var MYAPP = MYAPP || {} ;
但如果我省略var关键字(我知道这不是正确的方法),javascript会抛出错误“ReferenceError:MYAPP2未定义”。
MYAPP2 = MYAPP2 || {};
只是出于好奇,有人可以在第二种情况下解释为什么javascript无法解析引用。
答案 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 || {};
在第二种情况下,您正在重新声明变量尚未声明。