1.什么是变量提升?
在JavaScript中,变量提升(Hoisting)是一种特性,其中变量和函数声明在编译时被移动到它们各自的作用域的顶部。需要注意的是,只有声明会被提升,初始化并不会被提升。
看一段代码:
a = 2;
var a;
console.log(a)
你认为 console.log(..) 声明会输出什么呢?很多开发者会认为是undefined,因为var a在a=2之后,被重新声明了undefined,但是答案是:2
为什么呢?
是因为在编译阶段发生了变量提升,var a是一个变量声明,会被提升首先被处理,在运行阶段才会执行赋值a=2操作。
考虑下一段代码:
console.log(a)
var a = 2
你认为 console.log(..) 声明会输出什么呢?在这里可能又有开发者认为抛出异常:ReferenceError,因为a使用在声明之前,根据RHS查找,会抛出异常。但答案确是:undefined。
为什么呢?
还是因为变量提升,var a = 2;被分为两个阶段执行,编译阶段变量提升,var a;会在当前作用域声明一个变量a,在执行阶段,由于console.log()在a=2赋值之前,所以此时为undefined.
- 函数优先提升
函数声明和变量声明都会被提升,但是如果同时出现同名的变量和函数声明,则函数声明会优先提升。
考虑下面代码
foo()
var foo;
function foo(){
...
}
虽然var foo在前面,function foo在后面,但是foo最终还是被定义为一个函数,优先提升。
- let 和const不会发生变量提升