上一篇咱們說到了腳本的預編譯,這一節講一講函數調用的預編譯。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
複製代碼