变量提升
简单的说,就是将变量提升到它本身所在作用域的最开始的部分。
1 2 3 4 5
| console.log(a); //undefined
var a = "string";
console.log(a); //string
|
之所以出现这种情况,是因为 js 的变量提升,上面的例子等同于:
1 2 3 4 5 6 7
| var a;
console.log(a); //此时只是声明了变量,并没有进行赋值操作
a = "string";
console.log(a);
|
函数提升
创建函数有两种方式:分别是函数声明和函数字面量式。其中,只有函数声明才有函数提升。
1 2 3 4 5 6 7
| console.log(func1); // function func1(){}
console.log(func2); //undefined
function func1() {}
var f = function func2(){}
|
这种情况就是函数提升造成的,相当于下面这样:
1 2 3 4 5 6 7
| function func1(){}
console.log(func1);
console.log(func2);
var f = function func2(){]
|
现在举一个稍微复杂一点的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| var a = 1;
function b() {
console.log(a);
a = 10;
console.log(a); //10
var a = 11;
console.log(a); //11
return;
function a(){
alert("abc");
}
}
b(); //
console.log(a); //1
|
再同一个变量名的情况下,函数提升的优先级是高于变量提升的。上面的例子等同于:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| function b(){
function a(){
alert("abc");
}
console.log(a);
a = 10;
console.log(a);
a = 11;
console.log(a);
return ;
}
var a;
a = 1;
b();
console.log(a);
|