在这里,我只是为我的应用程序创建一个全局命名空间,一切都按预期工作
var MYAPP = MYAPP || {} ;
但是如果我省略 var 关键字(我知道这不是正确的方法),javascript 会抛出错误 "ReferenceError: MYAPP2 is not defined" 。
MYAPP2 = MYAPP2 || {};
出于好奇,有人可以在第二种情况下向我解释为什么 javascript 无法解析引用。
在这里,我只是为我的应用程序创建一个全局命名空间,一切都按预期工作
var MYAPP = MYAPP || {} ;
但是如果我省略 var 关键字(我知道这不是正确的方法),javascript 会抛出错误 "ReferenceError: MYAPP2 is not defined" 。
MYAPP2 = MYAPP2 || {};
出于好奇,有人可以在第二种情况下向我解释为什么 javascript 无法解析引用。
第一个版本不会产生错误,因为 Javascript 的变量提升使其等价于:
var MYAPP; // declares, but leaves the value undefined / unchanged
MYAPP = MYAPP || {}; // creates, if the value was previously undefined
重要的是,这里的声明部分不会覆盖已经对变量进行的任何现有声明或赋值。
这就是允许此模式在单个范围内重复使用的原因。 MYAPP
要么保留它已经拥有的值,要么被初始化为一个空对象。
在第二种情况下,该声明步骤实际上被省略了。如果变量尚未声明(或存在于范围内,即作为全局对象的属性),则会生成您看到的错误。
var MYAPP = MYAPP || {} 在当前范围(也称为执行上下文)中声明变量 MYAPP。如果声明出现在函数中 - 声明局部变量;如果它在全局范围内 - 声明全局变量。
MYAPP2 = MYAPP2 || 另一方面,{} 仅仅是一个属性分配。它首先尝试针对作用域链解析 MYAPP2。如果它在该范围链中的任何位置找到它,它就会执行分配;如果它没有找到 MYAPP2,那么它只会在全局对象(它是作用域链中的顶级对象)上创建 x 属性。
var 关键字立即声明您要引用的变量
var a = a || {};
就像
var a; a = a || {};
在第二种情况下,您引用的变量尚未声明。