为什么我的变量不能被提升?

4

我有一个全局变量i,我对它进行了递增操作(请参见此处的示例代码):

(function increment() {
   i += 1;   
})();

i = 0;

在Chrome中,我遇到了错误Uncaught ReferenceError: i is not defined

变量i不应该在这里被定义,所以在函数increment内部,变量i被定义为undefined吗?

1个回答

7
变量声明语句被提升。你没有声明。
声明语句使用 var 声明变量。由于你没有声明它,你只有赋值表达式,在表达式求值时隐式创建全局变量。
换句话说,没有正式声明就没有提升。
现在假设你正式声明了它,允许变量声明被提升。IIFE 中的操作将导致 NaN,但后来的赋值会将其覆盖为 0
这是因为只有声明被提升,而不是赋值。
// The 'var i' part below is actually happening up here.

(function increment() {
   i += 1;   // "i" is declared, but not assigned. Result is NaN
})();

var i = 0; // declaration was hoisted, but the assignment still happens here

console.log(i); // 0

“i = 0” 这一行不是声明和定义两个步骤合二为一了吗? - Randomblue
@Randomblue: 它创建了它,但它不是一个声明语句。它是一个赋值表达式,在表达式评估时隐式创建变量。 - I Hate Lazy
“i=0”不是创建变量吗?我认为问题在于“i += 1”。它相当于“i = i + i”,而你正在尝试使用尚未声明的“i”。 - MalSu
1
@MalSu:它会创建它,但是 i +=1 先执行,因此 ReferenceError 在有机会之前出现。如果使用 var 正式声明 i 变量,则该声明将被提升到函数(或全局环境)的顶部,即使该声明在 i += 1 之后,也不会出现错误。 - I Hate Lazy
换句话说,他知道在声明之前使用了 i += 1,但假设声明会被提升以防止错误。他本来是正确的,但是没有正式声明,就没有提升。 - I Hate Lazy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接