预解析:提前解析代码之前
预解析做什么事?
把变量的声明提前了 ---- 提前到当前所在的作用域的最上面
函数的声明也会被提前 — 提前到当前所在域的最上面
小小的脑袋,大大的疑惑说啥呢???
先举个例子:
console.log(num);//结果为:undefined
var num=10;
如果是从未了解过预解析的,肯定很困惑,为什么是undefined,之前猜想结果可能报错,或者是10。
其实它代码运行过程是这样的:
var num;
console.log(num);
num = 10;
所以结果是undefined,代码变量的声明会提前到作用域的最上面
同理函数的声明也会像这样提前声明到作用域的最上面
举个例子:
//函数调用的时候,会把函数的声明提升到作用域的上面
f1();//调用
var num = 20;
function f1(){
console.log(num);//undefined
var num = 10;
}
代码运行过程:
var num ;
num = 20;
function f1(){
var num;
console.log(num);//undefined
num = 10;
}
f1();//调用
注意:
- 预解析中,变量的提升,只会在当前的作用域中提升,提前到当前的作用域的最上面
- 函数中的变量只会提前到函数的作用域的最前面,不会出去
- 预解析会分段(多对的script标签中函数重名,预解析的时候不会冲突)
举个例子:
<script>
function fun2(){
console.log("哈哈")
}
fun2();//嘎嘎
function fun2(){
console.log("嘎嘎");
}
fun2();//嘎嘎
//在同一script中同名函数下面的函数会覆盖上面的函数
</script>
<script>
function fun2(){
console.log("哈哈")
}
fun2();//哈哈
</script>
<script>
fun2();//嘎嘎
function fun2(){
console.log("嘎嘎");
}
</script>
预解析经典案例1:
fun3();
console.log(c);//9
console.log(b);//9
console.log(a);//报错
function fun3(){
var a = b = c =9;
console.log(a);//9
console.log(b);//9
console.log(c);//9
};
函数里所输出的基本是没有多大问题,可为什么在函数外面输出的a 、b 、c是报错 、9、9呢?把过程写一下或许我们就出来了结果
console.log(c);//9
console.log(b);//9
console.log(a);//报错
function fun3(){
var a ;
a = 9;//局部变量
b = 9;//隐式全局变量
c = 9;//隐式全局变量
console.log(a);//9
console.log(b);//9
console.log(c);//9
};
fun3();
原来b和c是隐式全局变量,所以输出了9,而a属于局部变量,所以在外部不能调用。
不清楚三种变量作用范围的小伙伴请点这里全局变量、局部变量、隐式全局变量
预解析经典案例2:
fun4();//报错
var fun4 = function (){
console.log(a);
var a = 10;
}
这道题就是一种假象,不注意很容易错。fun4是var 出来的,变量的声明
var fun4;//变量预先声明
fun4();
fun4 = function (){
console.log(a);
var a = 10;
}
fun4()并不能调用,还未声明函数,所以报错。