首先JS三部曲
1.语法分析
1.分析有无语法错误
2.预编译(发生在函数执行之前)
1.创建AO对象
2.找形参和变量声明,将变量和形参名作为AO属性名,值为underfind
3.将实参值和形参统一
4.在函数体里找函数声明,值赋值函数体
3.解释执行
1.一句一句代码解释执行
例:
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.创建AO对象
AO {
}
2.找到形参和变量声明的名称,作为AO对象的属性名,值为underfind。
AO {
a : underfind,
b : underfind,
}
3.将实参值和形参统一
AO {
a : 1,
b : underfind,
}
4.在函数体里找函数声明,值赋值函数体。
AO {
a : function a(){},
b : underfind,
d : function d(){},
}
最后解释执行:
console.log(a);
function a() {}
var a = 123;
已经进行了声明提升所以现在进行赋值也就是:a = 123
修改AO对象为:
AO {
a : 123,
b : underfind,
d : function d(){},
}
console.log(a);
123
function a(){}
不用管
console.log(a);
123
var b = function () {};
修改AO对象为:
AO {
a : 123,
b : function () {},
d : function d(){},
}
console.log(b)
function () {}
function d() {}
不管
所以最终输出结果为
function a() {}
123
123
function () {}
例题:
function test(a,b){
console.log(a);
console.lgo(b);
var b = 234;
console.log(b);
a = 123;
console.log(a);
function a() {}
var a;
b = 234;
var b = function (){}
console.log(a);
console.log(b);
}