变量提升

  • 2021.06.02

在 ECMAScript 中有一个奇怪的语法规则: 变量提升。如果你使用了一个从未声明的变量,程序运行就会抛出错误。但是代码中如果使用 var 对其进行过声明,无论在声明前使用,还是在声明后使用,都不会报异常。

// 变量提升
console.log(name); // undefined

var name = "Jack";
console.log(name); // Jack

如果你直接对一个未声明的变量进行赋值,就相当于在全局作用域声明了这样的一个变量,会造成无意的变量泄露。

// 变量泄露
function func() {
  age = 24;
}

func();

console.log(age); // 24

造成这种现象的原因是: JavaScript解释器在对代码进行扫描的时候,会将全局作用域中声明的变量和函数先定义为全局符号,运行到具体声明处才进行赋值。

// 变量提升
console.log(name); // undefined

if (false) {
  var name = "Jack";
}

for (var i = 0; i < 3; i++) {
  var sum = i;
}
console.log(i); // 3
console.log(sum); // 2

上述的示例代码中,首先 if 条件判断语句为 falseif 内部的代码永远不会执行,但是从结果中我们可以看到第一句打印的语句并不会报错,name 变量还是被声明了。

而在后面的循环结构中,我们在 for 循环条件语句中声明了一个 i 变量,在循环体内部声明了 sum 变量,可是当 sum 循环结束后,i 变量依然存在,变成了全局的变量

sum 同样也变成了全局的变量,这种所谓的变量提升会消耗一部分无用内存,并对之后的代码编写产生额外的风险。

上次更新时间: 2021-06-07 09:34:00