在程序执行上下文的时候,先把 var/let 和 function 声明的变量前置,再去顺序执行代码。
但是三者各有区别:
var
console.log(a); // undefined
var a= '123';
console.log(a); // 123
实际的执行过程是:
var a;
console.log(a);
a= '123';
console.log(a);
即用var创建的变量,创建和初始化过程被提升了,赋值过程并没有被提升。
function
console.log(fn); //fn() {}
function fn() {
}
function 的创建、初始化和赋值都被提升了。
但是,需要注意的是:
函数表达式赋值过程并不会被提升:
console.log(fs);//undefined
var fs=function fn() {}
console.log(fs);//fn() {}
总结:函数变量提升分为两种,即函数声明式创建、初始化、赋值过程都会被提升,函数表达式又回归到了var变量提升的问题上,只创建和初始化两个步骤被提升。
let
console.log(a);
let a= '123';
let 的创建过程被提升了,但是初始化没有提升。