我猜不出为什么会在下面的代码中发生这种情况:
(function(){
console.log(`v1: `,v1); // show "undefined"
console.log(`v2: `,v2); // show "Uncaught ReferenceError: v2 is not defined"
if (true) {
var v1 = 'something';
}
})();
为什么v1
显示undefined
?如果必须要v2
,因为v1
在if
块内定义。
答案 0 :(得分:4)
这是因为Hoisting
。 v1
的声明首先发生,然后是作业。
您的代码实际上解释为:
(function(){
var v1;
console.log(`v1: `,v1); // show "undefined"
console.log(`v2: `,v2); // show "Uncaught ReferenceError: v2 is not defined"
if (true) {
v1 = 'something';
}
})();

答案 1 :(得分:2)
使用var
声明变量将其定义提升到函数范围的顶部。因此v1
已声明但未定义(您在v1
下定义if
)。 v2
未在函数范围内声明,因此出现了不同的错误。
答案 2 :(得分:1)
此行为称为Hoisting
从概念上讲,例如,对提升的严格定义表明变量和函数声明在物理上移动到代码的顶部,但事实上并非如此。相反,变量和函数声明在编译阶段被放入内存中,但保留在编码中键入的位置。
JavaScript只提升声明,而不是初始化。如果在使用变量后声明并初始化该变量,则该值将是未定义的