函數調用的預編譯

1、前言

上一篇咱們說到了腳本的預編譯,這一節講一講函數調用的預編譯。javascript


2、函數調用的預編譯

1. 過程

1.建立活動對象AO(Active Object)java

2.預編譯:git

  • 產生做用域鏈(scope chain)
  • 初始化arguments
  • 初始化形參,將arguments中的值賦值給形參
  • 找出全部的變量聲明,按照變量名加入AO,若是已存在,忽略。
  • 找出全部的函數聲明,按照函數名加入AO,若是已經存在同名變量或者函數,替換。
  • this初始化

3.解釋執行代碼github

2. 解析

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
複製代碼

3、本節思惟導圖

源碼地址: github.com/Knight174/M…
相關文章
相關標籤/搜索