2.预编译
2.1 函数声明整体提升
2.2 变量声明提升
2.3 预编译前奏
1. imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有。
eg: a=123;
eg: var a=b=123;
2.一切声明的全局变量,全是window的属性。
eg:var a=123;===>window.a=123;
2.4 预编译(发生在函数执行的前一刻)
四部曲:
1.创建AO对象
2.找形参和变量声明,将变量和形参作为AO属性名,值为undefined
3.将实参和形参统一
4.在函数体里面找函数声明,值赋予函数体
案例:
Function fn(a){
console.log(a);
var a=123;
console.log(a);
function a(){};
console.log(a);
var b=function(){};
console.log(b);
function d() {};
}
fn(1);
案例
1》先找本层(本作用域)===>逐级向外查找
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
var a = 10;
function fn(){
var a = 20;
console.log(a);
}
fn();
</script>
</body>
</html>
2》优先级
变量—>函数—>参数---->变量提升
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function fn(num){//3参数
var num = "变量";//1变量
console.log(num);
var num = 10;//4提升
function num(){//2函数
}
}
fn(5);
</script>
</body>
</html>
注意: 函数(声明)===》不看执行顺序的, 不管函数(声明)放在那个位置优先级都是第2级