我有一个全局变量i
我会增加(参见小提琴here):
(function increment() {
i += 1;
})();
i = 0;
在Chrome中,我收到错误Uncaught ReferenceError: i is not defined
。
变量i
不应该在此处托管,因此在函数increment
中,变量i
被定义为undefined
?
答案 0 :(得分: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