声明提前
var 声明变量时声明提前,并初始化成 undefined,赋值还在原来的位置。(let, const 声明时未进行初始化,不能使用)
function 声明的函数体都会提前(可以在前面执行)
Class 没有声明提前(相当于 let 定义)(Class 也可以用表达式定义)
var a = 0;{a = 1; // 赋值给下面的 function aconsole.log(a, window.a); // 1,0// 非严格模式可以在语句块定义函数// 声明提前到语句块外面,函数体提前到块内最前面(且块内不能重新声明 var a),但和 var 一样执行到这里才将局部 a 的值赋值给外面的 afunction a() {}console.log(a, window.a); // 1,1}foo();var foo = 0;function foo(){ console.log(1);}foo = function(){ console.log(2);};用 var 声明的变量和命名函数都会被提升到代码的最前面,只不过声明的变量的赋值语句在代码中的位置不变。所以上面这段代码应该被理解为:var foo;function foo(){ console.log(1);}foo();foo = 0;foo = function(){ console.log(2);};