预编译
js执行顺序: 词法/语法分析 预编译 解释执行
- js中存在预编译
function demo() {
console.log('I am demo');
}
demo(); //I am demo
test(); // I am test
//分析: 由于test函数可以执行,所以javascript一定存在预编译机制
function test() {
console.log(" I am test")
}
var a;
console.log(a) //undefined
a = '123'
- 预编译发生在函数执行前一刻
- 预编译执行的步骤:
- 1创建执行期上下文,activation object ,即AO
- 2找形参和变量声明,将形参和变量声明做为AO的属性名,尚未赋值,值为undefined
- 3将形参和实参相统一, 即把实参的值传到形参里面去
- 4在函数体里面找函数声明,赋值函数体
- 实例
function demo(a, b){
console.log(a)
c =0;
var c;
a = 1;
b = 3;
console.log(d)
function d(){
console.log(d)
}
function e(){
console.log(e)
}
}
demo(1)
// 1.创建AO对象{}
// 2.找形参和变量声明
AO = {
a:undefined,
b: undefined,
c: undefined,
}
//3. 形参实参想统一
AO = {
a:1,
b: undefined,
c: undefined,
}
// 4.在函数体里面找函数声明,值赋函数体
AO = {
a:1,
b: undefined,
c: undefined,
d:function d(){
console.log(d)
},
e: function e(){
console.log(e)
}
}
// 5.解释执行