做用域學習筆記(一)

今天就簡單記錄下 var a = 2的時候發生了什麼呢?學習

1、人物關係

一、引擎
從頭至尾負責整個JavaScript程序的編譯及執行過程。code


二、編譯器
引擎的好朋友,負責語法分析及代碼生成等髒活累活。ip


三、做用域
引擎的另外一位朋友,負責收集並維護全部生命的標識符組成的一系列查詢,並實施一套很是嚴格的查詢,肯定當前執行的代碼對這些標識符的訪問權限。作用域

2、對話

當咱們看到var a = 2;的時候,就會以爲這是一個聲明而已。編譯器

但咱們的朋友們卻不這麼認爲,引擎認爲這裏有兩個聲明,一個是編譯器編譯的時候處理的,一個是引擎運行處理的。編譯

3、分工合做

一、編譯器遇到 var a,編譯器會詢問做用域是否有一個該名稱的變量存在同一個做用域。若是是,編譯器就會忽略該聲明,繼續進行編譯;不然它會要求做用域在當前域聲明一個新的變量,並命名爲a;變量


二、接下來編譯器會爲引擎生成運行時所須要的代碼,這些代碼被用來處理 a = 2這個賦值操做。引擎運行時首先會詢問做用域,當前做用域是否存在 a變量,若是是,引擎就會使用這個變量。若是否,引擎就會繼續查找該變量(經過做用域鏈)。權限


若是最終引擎找到了變量,就會將2賦值給他。不然引擎就會拋出一個異常,你這個找不到的啦!學習筆記


本文是《你不知道的JavaScript》的學習筆記,文中舉例非本人原創。語法

相關文章
相關標籤/搜索