1 变量提升
js创建变量的过程:
var a = 1;
var b = 2;
js在解析上面的代码的时候,其实会按照下面的方式进行解析的:
var a;
var b;
a = 1;
b = 2;
所以 js 定义一个变量的时候,并不是声明后立即赋值,而是全部声明之后,再到变量的定义的地方赋值。
变量声明的过程就是变量的提升。
function foo() {
var a = 1;
console.log(a);
console.log(b);
var b = 2;
}
foo();
上面的代码在js的眼中是这样解析的:
function foo() {
var a;
var b;
a = 1;
console.log(a); // 1
console.log(b); // undefined
b = 2;
}
foo();
变量在声明提升的时候,是全部提升到作用域的最前面。但是赋值的位置在变量原本定义的位置。
所以变量提升,提升的是声明,而不是赋值。
2 函数提升
函数的提升和变量的提升类似,都是提升到作用域的最前面。只不过变量提升是分两步的,第一步变量声明提升,第二步是变量赋值。而函数提升是直接将整个函数提升到作用域的最前面,相当于剪切过去。
function foo() {
console.log(a);
var a = 1;
console.log(a);
function a() {}
console.log(a);
}
foo();
上面的代码在js眼中是这样解析的:
function foo() {
var a;
function a() {}
console.log(a); // [Function: a]
a = 1;
console.log(a); // 1
console.log(a); // 1
}
foo();
所以从上面的例子可以看到,函数提升是相当于直接剪切到最前面的。