创建不带 var 关键字的全局变量时出现意外行为
unexpected behavior when creating global variable without var keyword
在这里,我只是为我的应用程序创建一个全局命名空间,一切都按预期工作
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 || {};
在第二种情况下,您正在引用尚未声明变量。
相关文章:
- 全局变量和全局对象的属性之间有什么区别吗
- delete关键字在全局变量上的不同行为
- 在javascript函数中设置全局变量
- 如何将getJson的响应保存在全局变量中
- 从Javascript方法返回全局变量
- AngularJS中的封装窗口全局变量
- javascript隐式全局变量
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 如何使全局变量仅特定于该文件
- 在page.open()-PhantomJS中无法访问全局变量
- 使用全局变量来存储数字(JavaScript)
- 如何将变量声明为全局变量
- 在节点中创建文件全局变量
- 在Javascript中使用全局变量作为缓存是很好的
- 创建要在其他函数中使用的全局变量
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 函数中的innerHTML(全局变量?)
- 如何在javascript中为全局变量赋值
- chrome中的意外全局变量有解决方案吗
- 创建不带 var 关键字的全局变量时出现意外行为