上一篇咱们说到了脚本的预编译,这一节讲一讲函数调用的预编译。javascript
1.建立活动对象AO(Active Object)java
2.预编译:git
3.解释执行代码github
1.函数中的全部变量声明,在函数的预编译阶段完成,全部变量与实际书写位置无关。函数
function f() {
console.log(aa); // undefined
var aa = 5;
console.log(aa); // 5
}
f();
复制代码
2.函数中的全部函数声明,在函数的预编译阶段完成,全部变量的声明与实际书写位置无关。ui
function f() {
console.log(haha);
function haha() {
console.log(123);
}
}
f();
复制代码
3.函数中,若是变量与函数同名,那么函数将覆盖变量。this
function f() {
console.log(haha);
var haha = 123;
function haha() {
console.log(456);
}
}
复制代码
4.函数中,只有函数能覆盖变量,变量没法覆盖函数。spa
function f() {
console.log(haha);
function haha() {
console.log(123);
}
var haha = 456;
}
f();
复制代码
5.函数中,后面的函数声明会覆盖前面的函数声明,而且忽略参数。code
function f() {
console.log(haha);
function haha(a) {
console.log('aaa');
}
function haha(a, b) {
console.log('bbb');
}
}
f();
复制代码
6.当函数预编译后,遇到须要访问的变量或函数,优先考虑本身AO中定义的变量和函数,若是找不到,才会在其定义的上层AO中寻找,直到到达GO。cdn
var scope = 'global';
function t() {
console.log(scope); // undefined
var scope = 'local';
console.log(scope); // local
}
t();
console.log(scope); // global
复制代码