一、人物關(guān)系
1、引擎
從頭到尾負(fù)責(zé)整個JavaScript程序的編譯及執(zhí)行過程。
2、編譯器
引擎的好朋友,負(fù)責(zé)語法分析及代碼生成等臟活累活。
3、作用域
引擎的另一位朋友,負(fù)責(zé)收集并維護所有生命的標(biāo)識符組成的一系列查詢,并實施一套非常嚴(yán)格的查詢,確定當(dāng)前執(zhí)行的代碼對這些標(biāo)識符的訪問權(quán)限。
二、對話
當(dāng)我們看到var a = 2;
的時候,就會覺得這是一個聲明而已。
但我們的朋友們卻不這么認(rèn)為,引擎認(rèn)為這里有兩個聲明,一個是編譯器編譯的時候處理的,一個是引擎運行處理的。
三、分工合作
1、編譯器遇到
var a
,編譯器會詢問作用域是否有一個該名稱的變量存在同一個作用域。如果是,編譯器就會忽略該聲明,繼續(xù)進行編譯;否則它會要求作用域在當(dāng)前域聲明一個新的變量,并命名為a
;
2、接下來編譯器會為引擎生成運行時所需要的代碼,這些代碼被用來處理
a = 2
這個賦值操作。引擎運行時首先會詢問作用域,當(dāng)前作用域是否存在a
變量,如果是,引擎就會使用這個變量。如果否,引擎就會繼續(xù)查找該變量(通過作用域鏈)。
如果最終引擎找到了變量,就會將2賦值給他。否則引擎就會拋出一個異常,你這個找不到的啦!
本文是《你不知道的JavaScript》的學(xué)習(xí)筆記,文中舉例非本人原創(chuàng)。