作用域
在JavaScript中恕刘,我們可以將作用域定義為一套規(guī)則,這套規(guī)則用來管理引擎如何在當(dāng)前作用域以及嵌套的子作用域中根據(jù)標(biāo)識符(即變量名或者函數(shù)名)名稱進(jìn)行變量查找借笙。
作用域與執(zhí)行上下文是完全不同的兩個概念。
代碼執(zhí)行過程的兩個階段:
編譯階段由編譯器完成十偶,將代碼翻譯成可執(zhí)行代碼,這個階段作用域規(guī)則會確定。
執(zhí)行階段由引擎完成嘹悼,主要任務(wù)是執(zhí)行可執(zhí)行代碼,執(zhí)行上下文在這個階段創(chuàng)建层宫。
作用域鏈
作用域鏈?zhǔn)窃趫?zhí)行上下文的創(chuàng)建階段生成的杨伙。作用域鏈?zhǔn)亲饔糜蜻@套規(guī)則的具體實(shí)現(xiàn)。
作用域鏈萌腿,是由當(dāng)前環(huán)境與上層環(huán)境的一系列變量對象組成限匣,它保證了當(dāng)前執(zhí)行環(huán)境對符合訪問權(quán)限的變量和函數(shù)的有序訪問。
作用域鏈?zhǔn)怯梢幌盗凶兞繉ο蠼M成哮奇,在這個單向通道中膛腐,可以查詢變量對象中的標(biāo)識符,就能訪問到上一層作用域中的變量了
閉包
閉包與作用域鏈息息相關(guān)鼎俘;
閉包是在函數(shù)執(zhí)行過程中被確認(rèn)哲身。
當(dāng)函數(shù)可以記住并訪問所在的作用域(全局作用域除外)時,就產(chǎn)生了閉包贸伐,即使函數(shù)是在當(dāng)前作用域之外執(zhí)行勘天。
簡單來說,假設(shè)函數(shù)A在函數(shù)B的內(nèi)部進(jìn)行定義了捉邢,并且當(dāng)函數(shù)A在執(zhí)行時脯丝,訪問了函數(shù)B內(nèi)部的變量對象,那么B就是一個閉包伏伐。
通過閉包宠进,我們可以在其他的執(zhí)行上下文中,訪問到函數(shù)的內(nèi)部變量藐翎。