1、js运行三部曲
语法分析、预编译、解释执行
2、预编译
预编译发生在函数执行的前一刻
第一步:创建GO或AO对象(执行期上下文)
第二步:将形参和var声明的变量作为AO的属性名,值为undefined
第三步:将实参和形参统一
第四步:在函数体里面找函数声明,将声明的函数名作为AO的属性名,值为函数体、
实例1:
function fn(a){
console.log(a)
var a = 123;
console.log(a)
function a (){}
console.log(a)
var b = function () {}
console.log(b)
}
fn(1)
预编译过程
第一步:创建AO对象 AO { }
第二步:找形参和var声明的变量作为AO对象的属性,值为undefined
AO {
a: undefined,
b: undefined
}
第三步:将实参和形参统一
AO {
a: 1,
b: undefined
}
第四步:找函数声明,将声明的函数名作为AO对象的属性名,值为声明的函数体
AO {
a: function a(){},
b: undefined
}
执行函数fn
function fn(a){
console.log(a) // function a(){ }
var a = 123;
console.log(a) // 123
function a (){}
console.log(a) // 123
var b = function () {}
console.log(b) // function (){ }
}
实例2:
function test(a, b){
console.log(a) // 1
c = 0;
var c;
a = 3;
b = 2;
console.log(b) // 2
function b(){ }
function d(){ }
console.log(b) // 2
}
test(1)
预编译:
AO {
a: 1,
b: function b(){ },
c: undefined,
d: function d(){ }
}