JS函数预编译及函数作用域
js代码的历程:1. 语法分析(检查所有代码是否存在语法错误,若有直接报错,不执行)
2. 预编译(发生在代码执行的前一刻)
3. 解释执行(解释一句执行一句)
函数预编译
- 创建执行期上下文[Activation Object/ 作用域对象](AO{})
- 找形参和变量声明,将形参和变量作为AO对象属性名(变量声明提前)
- 将形参和实参统一
- 函数声明提前,赋值函数体
-
注意事项:变量/函数声明作为AO对象的属性名的时候,如果遇到同名会覆盖
-
案例:
函数作用域
function big(a,b){//形参
var c = 5,a = 7;//变量
var a = function a(){//函数
console.log(c);
};
return [a,b,c];//以数组形式返回
}
console.log(big(3,4)[0]);//a的函数体
big(3,4)[0]();//5
console.log(big(3,4)[1]);//4
console.log(big(3,4)[0]());//undefined
变量可用范围:若函数体内存在多个函数,则函数体内的函数执行过程中没有的变量可以沿着父级逐一向包裹它的元素查找(这里以a函数的执行结果为例)。
-注意:函数执行完立即销毁(以第9,11行代码执行结果为例)。