创建不带 var 关键字的全局变量时出现意外行为

unexpected behavior when creating global variable without var keyword

本文关键字:意外 全局变量 var 关键字 创建      更新时间:2023-09-26

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

var MYAPP = MYAPP || {} ; 

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

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 || {};

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