1.什么是变量提升?
在变量的作用域内,不管变量在何处声明,都会被提升到作用域的顶部,但是变量初始化的顺序不变。(注意,变量提升只将声明部分提升,赋值部分不改变位置,具体可以看例子理解)
2.举个例子
function test() {
a=1;
b=2;
c=3
var a,b,c;
console.log(a);
console.log(b);
console.log(c);
}
test();
// 输出 1 2 3
为什么我先赋值后声明,没报错还正确输出了呢?这就是按照变量提升的原则,把变量声明提升到了最顶部,在代码执行前,js编译器会将代码改成这样:
function test() {
var a,b,c;
a=1;
b=2;
c=3
console.log(a);
console.log(b);
console.log(c);
}
test();
3.再举个例子
var value="1";
function test() {
console.log(value);
var value="2";
}
test();
// 输出 undefined
为什么输出undefined,而不是var声明的全局变量value呢?因为变量提升,把声明提到最顶部,所以js在执行这段代码时是这样的:
var value="1";
function test() {
var value;
console.log(value);
value="2";
}
test();
4.再来一个经典面试题
console.log(value);
var value= 1;
function test() {
console.log(value);
var v1 = 2;
console.log(value);
}
test();
console.log(value);
//答案是.........
//undefined
//undefined
//2
//1
小结:
我们习惯将var a = 2;看做是一个声明,而实际上javascript引擎并不这么认为。它将var a和a = 2看做是两个单独的声明,第一个是编译阶段的任务,而第二个则是执行阶段的任务。
这意味着无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理,可以将这个过程形象地想象成所有的声明(变量和函数)都会被“移动”到各自作用域的最顶端,这个过程被称为提升。