理解JavaScript中的作用域鏈

理解了作用域鏈,閉包就不難理解了,所以本文主要談一談我對(duì)作用域鏈的理解。
 
關(guān)于JavaScript中變量的作用域,全局變量在程序中始終都有定義。局部變量在聲明它的函數(shù)體內(nèi)以及其內(nèi)部所嵌套的函數(shù)內(nèi)始終是有定義的。那么JavaScript是如何管理這些全局變量和局部變量作用域的呢,這就涉及到了作用域鏈。
作用域鏈相當(dāng)于一個(gè)對(duì)象鏈表。鏈表的上的對(duì)象定義了這段script代碼中的變量。如果要查找一個(gè)變量x,則會(huì)從這個(gè)作用域鏈的當(dāng)前有權(quán)限訪問(wèn)的最底層對(duì)象開始找起,如果這個(gè)對(duì)象有一個(gè)名叫x的屬性,則直接使用這個(gè)屬性的值,如果沒(méi)有找到繼續(xù)向外層找其他的對(duì)象上是否有這個(gè)屬性,直到找到作用域鏈的尾部,如果還沒(méi)有,就返回undefined。
這里的“里層,外層”就是內(nèi)部函數(shù)對(duì)包裹它的函數(shù)是不可訪問(wèn)的,提前說(shuō)明一下有利于之后的理解。
 

在如下所示的JavaScript頂層代碼中(不包含任何函數(shù)內(nèi)定義的代碼):