【问题标题】:Javascript hoisting and global scope declarationJavascript 提升和全局范围声明
【发布时间】:2020-12-10 13:21:49
【问题描述】:

在 javascript 中,编译阶段查找所有声明并将其与其适当的范围相关联。

案例1

a = 2;
console.log(a);

如果不用于严格模式,则假定 sn-p 实际处理为:

var a;
a = 2;
console.log(a);

输出:2

案例2

如果声明发生在 console.log() 之下

  console.log(a); 
  var a = 2;

在第 1 行:编译器将在其范围内检查 a 的声明,如果未找到,则全局范围将分配一个,并且相同的代码将再次假定为相同

   var a; 
   console.log(a);
   a = 2;

输出:未定义 // 因为解释器读取控制台时没有赋值

案例3

 console.log(a); 
 a = 2;

输出:RefErr

为什么这会引发引用错误而不是未定义?

【问题讨论】:

标签: javascript


【解决方案1】:

如果您仔细查看前两种情况,您总是在声明变量 a,而在 JavaScript 中只有声明被提升。

话虽如此,在您的Case 3 中,变量a 从未声明过,因此这里无法进行提升。这样,范围内就没有名称为 a 的变量,因此,ReferenceError。

如果您查看ReferenceError 的描述,则显示为:

当引用不存在的变量时,ReferenceError 对象表示错误。

【讨论】:

    【解决方案2】:

    隐式全局变量不暗示var 语句。没有吊起它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多