先说一下函数执行过程
js执行分三步:1、语法分析,2、预编译,3、解释执行。
函数的预编译发生在函数执行前一刻,预编译时函数声明整体提升,变量声明提升。
预编译主要有四个步骤
一:预编译发生在函数执行的前一刻
1.创建 A0对象(执行期上下文)
2.找形参和变量声明,将变量声明和形参名作为AO属性名,值为undedined
3.将实参值和形参统一
4.在函数体里面找到函数声明,值赋予函数体
二:执行
5.从上往下执行语句(预编译已经看过就不用再看了) 变量声明提升 函数声明整体提升
function fn(a) {
console.log(a); //ƒ a() {}
var a = 123;
console.log(a); //123
function a() {}
console.log(a); //123
var b = function () {};
console.log(b); //ƒ () {}
function d() {}
console.log(d); //ƒ d() {}
}
//2. var AO={
// a:undedined,
// b:undedined
// }
//3. var AO={
// a:1,
// b:undedined
// }
//4. var AO={
// a:function a() {},
// b:undedined,
// d:function d() {}
// }
//5从上往下执行. var AO={
// a:function a() {}----123,
// b:undedined----function () {},
// d:function d() {}
// }
fn(1)
全局预编译
<script>
// 全局预编译
// 1、GO
// 2.查找函数体,赋值
var GO = {
hah: function hah(hah) {},
hhh: undefined
}
console.log(hah) //function hah(hah) {....l.}
console.log(hhh) //undefined
var hhh = 10;
function hah(hah) {
console.log(hah); //function hah() {}
console.log(hhh); //undefined
var hah = 234;
var hhh = 11;
console.log(hah) //234
console.log(hhh); //11
function hah() {}
console.log(hah) //234
}
// 生成AO(ao里面有从ao拿,没有从go拿)
var AO = {
hah: function hah() {},
hhh: undefined
}
hah(1);
var hah = 123;
console.log(hah) //123
console.log(hhh) //10
</script>