js作用域鏈
JavaScript中有一個(gè)被稱(chēng)為作用域(Scope)的特性。或許并不是很好理解,我們先來(lái)看一下關(guān)于作用域的描述摩瞎。作用域是在運(yùn)行時(shí)代碼中的某些特定部分中變量拴签,函數(shù)和對(duì)象的可訪(fǎng)問(wèn)性。換句話(huà)說(shuō)旗们,作用域決定了代碼區(qū)塊中變量和其他資源的可見(jiàn)性蚓哩。
作用域的使用提高了程序邏輯的局部性,增強(qiáng)程序的可靠性上渴,減少名字沖突岸梨。
上面的話(huà)可能比較難以理解喜颁,那么我們來(lái)看幾個(gè)例子,加深理解曹阔。
圖中的fn()輸出為2
原因:fn1()執(zhí)行到最后是fn2(),fn2()內(nèi)部沒(méi)有定義變量半开,所以從當(dāng)前函數(shù)所在的作用域去找,即f1()中查找赃份,因?yàn)閒n2()為fn1()的內(nèi)部函)寂拆,fn1()中a=2,所以輸出為2。
圖中的fn()輸出為1
原因:執(zhí)行fn1()后最終的調(diào)用函數(shù)為fn2(),而fn2()中沒(méi)有定義a變量,所以依次向上從每層作用域?qū)ふ易兞縜,不難發(fā)現(xiàn)它的作用域是全局抓韩,全局變量a為1纠永,所以結(jié)果輸出為1。
圖中的fn()輸出為undefined
原因:因?yàn)閳?zhí)行結(jié)果為fn2(),它內(nèi)部沒(méi)有定義a,所以從它的作用域去尋找--即fn3(),因?yàn)閍=4的賦值語(yǔ)句在fn2()后執(zhí)行(代碼的編譯順序如下)
var a
fn2()
a = 4
所以此時(shí)a只是定義了還沒(méi)有賦值谒拴,所以a為undefined.
綜上:
- 函數(shù)在執(zhí)行的過(guò)程中尝江,先從自己內(nèi)部找變量
- 如果找不到,再?gòu)膭?chuàng)建當(dāng)前函數(shù)所在的作用域去找, 以此往上
- 注意找的是變量的當(dāng)前的狀態(tài)
總結(jié):通過(guò)上文我想讀者應(yīng)該對(duì)作用域鏈的理解應(yīng)該有個(gè)比較直觀的印象了英上,平時(shí)的時(shí)候多看一下關(guān)于這方面的知識(shí)炭序,畢竟這是JavaScript中比較重要的內(nèi)容。