Javascript基础-变量提升

76 阅读1分钟

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.

  1. 函数优先提升

函数声明和变量声明都会被提升,但是如果同时出现同名的变量和函数声明,则函数声明会优先提升。

考虑下面代码

foo()
var foo;
function foo(){
    ...
}

虽然var foo在前面,function foo在后面,但是foo最终还是被定义为一个函数,优先提升。

  1. let 和const不会发生变量提升