基础很关键,抓紧时间重新复习一下
Javascript是解释型语言,运行过程如下:
- 语法分析(检查js是否存在语法错误)
- 预编译(js代码执行之前,在内存中开辟空间,创建js的变量对象,存放变量与行数)
- 解析执行(执行js)
预编译做了哪些事情:
1.创建AO对象
隐式创建的js变量对象,AO(Activation Object)对象,供js引擎自己去访问的
AO:{
a:undefined
c:undefined
}
2.查找形参和变量声明,将形参名和变量名作为AO对象的属性,值为undefined
注意此处是变量声明(必须带var),只是查找形参名和变量声明名不赋值。
3.实参和形参相统一
即修改AO对象中属性名为形参的值为传入的实参,如果没有形参此步略过。
4.查找函数声明,函数名作为AO对象的属性,函数体作为的值
此处是函数声明,而非匿名函数和函数表达式。函数申明会覆盖变量的申明
结论: 预编译过程就是查找变量声明、形参和函数声明的过程,并不初始化赋值,在解释执行阶段才会进行初始化 。
举例:
function fn (a, c) {
console.log(a) // function a () { }
var a = 123
console.log(a) // 123
console.log(c) // function c () { }
function a () { }
if (false) {
var d = 780
}
console.log(d) // undefined
console.log(b) // undefined
var b = function () { }
console.log(b) // function () { }
function c () { }
console.log(c) // function c () { }
}
fn(1, 2)
->> 查找变量和形参 ->
AO:{
a: undefined 1
c: undefined 2
d: undefined
b: undefined
}
结果: