函数调用的预编译
一、前言
上一篇我們說到了腳本的預編譯,這一節(jié)講一講函數(shù)調用的預編譯。
二、函數(shù)調用的預編譯
1. 過程
1.創(chuàng)建活動對象AO(Active Object)
2.預編譯:
- 產生作用域鏈(scope chain)
- 初始化arguments
- 初始化形參,將arguments中的值賦值給形參
- 找出所有的變量聲明,按照變量名加入AO,如果已存在,忽略。
- 找出所有的函數(shù)聲明,按照函數(shù)名加入AO,如果已經存在同名變量或者函數(shù),替換。
- this初始化
3.解釋執(zhí)行代碼
2. 解析
1.函數(shù)中的所有變量聲明,在函數(shù)的預編譯階段完成,所有變量與實際書寫位置無關。
function f() {console.log(aa); // undefinedvar aa = 5;console.log(aa); // 5 } f(); 復制代碼2.函數(shù)中的所有函數(shù)聲明,在函數(shù)的預編譯階段完成,所有變量的聲明與實際書寫位置無關。
function f() {console.log(haha);function haha() {console.log(123);} } f(); 復制代碼3.函數(shù)中,如果變量與函數(shù)同名,那么函數(shù)將覆蓋變量。
function f() {console.log(haha);var haha = 123;function haha() {console.log(456);} } 復制代碼4.函數(shù)中,只有函數(shù)能覆蓋變量,變量無法覆蓋函數(shù)。
function f() {console.log(haha);function haha() {console.log(123);}var haha = 456; } f(); 復制代碼5.函數(shù)中,后面的函數(shù)聲明會覆蓋前面的函數(shù)聲明,并且忽略參數(shù)。
function f() {console.log(haha);function haha(a) {console.log('aaa');}function haha(a, b) {console.log('bbb');} } f(); 復制代碼6.當函數(shù)預編譯后,遇到需要訪問的變量或函數(shù),優(yōu)先考慮自己AO中定義的變量和函數(shù),如果找不到,才會在其定義的上層AO中尋找,直到到達GO。
var scope = 'global'; function t() {console.log(scope); // undefinedvar scope = 'local';console.log(scope); // local } t(); console.log(scope); // global 復制代碼三、本節(jié)思維導圖
源碼地址:github.com/Knight174/M…總結
- 上一篇: react-native-webview
- 下一篇: php协议任意文件读取