1. 程式人生 > >JavaScript中的作用域鏈(scope chain)

JavaScript中的作用域鏈(scope chain)

第一篇部落格,略有手抖,不知道應該撿哪句說起。開博最重要的目的就是做一些自己的技術沉澱。之前不是不想開,是因為確實自己確實沒有積累,即使勉強寫出點什麼,我想大抵也是東拼西湊吧,這樣不如不幹。


幹,就像個樣子。分隔符---此為前話。


近幾日精讀JavaScript高階程式設計,感覺收貨頗豐。尤其讀到第七章“函式表示式”,讓我對JavaScript有了更深層次的認識。面試中出現頻率較高的一個問題也許就包括:“請你談談對JS中作用域鏈的理解”。我敢說如果你沒仔細拜讀過尼古拉斯先生的JavaScript高階程式設計的話,必定懵逼,或是get不到重點。


所謂作用域鏈(scope chain),其實就是一個指標列表,這些指標指向的是每個函式在呼叫的時候都會產生的變數物件。對,就是對變數物件的引用。作用域鏈的產生過程是這樣的:函式在建立的時候同時也會建立一個包含全域性變數物件的作用域鏈,別急,這時候這個鏈子上只有一個全域性變數物件。下一步,呼叫函式(不然建立函式幹嘛~),此時會有相應的函式執行環境產生,理所當然地會產生一個該執行環境的變數物件(因為每個執行環境都有一個變數物件),那麼它就會被當做活動物件被推入作用域鏈的前端。到這裡,一個完整的作用域鏈產生了,它包含兩個變數物件:本地活動物件和全域性變數物件。
每個函式在執行時都會有一個執行環境,而每個執行環境中都有相應的變數物件,其實作用域鏈正是由這些變數物件連線得到。在搜尋變數時,會沿著作用域鏈自下而上進行搜尋,如果該變數存在於活動物件中則停止搜尋,否則繼續向上搜尋,直至找到該變數。