書(shū)中解釋了作用域的概念:負(fù)責(zé)所有標(biāo)識(shí)符組成的一系列查詢(xún),確定訪(fǎng)問(wèn)權(quán)限。
關(guān)于查詢(xún)关带,分為左查詢(xún)(LSH),右查詢(xún)(RSH)沼撕;可簡(jiǎn)單理解賦值操作為執(zhí)行LSH宋雏,取值/引用操作為RSH。
一务豺,以var a = 2;
為例,我們分析JavaScript的LSH查詢(xún)過(guò)程磨总,我們把聲明和賦值分開(kāi)看:
首先是 var a
:
1.查詢(xún)當(dāng)前作用域是否有變量a
;
2.如果沒(méi)有笼沥,就在當(dāng)前作用域聲明一個(gè)蚪燕;
3.如果有娶牌,就忽略該聲明,繼續(xù)往下執(zhí)行馆纳。
其次是a = 2;
:(執(zhí)行LSH)
1.查詢(xún)當(dāng)前作用域是否有變量a
诗良;
2.如果沒(méi)有,就往上一級(jí)作用域查找鲁驶,直到全局作用域?yàn)橹估郯瘢唬ǚ菄?yán)格模式下)全局作用域沒(méi)找到,就在全局作用域聲明一個(gè)變量a灵嫌,嚴(yán)格模式下壹罚,會(huì)出現(xiàn)ReferenceError
;
3.如果有寿羞,進(jìn)行賦值操作猖凛。
二,以console.log(a);
為例绪穆,我們分析RSH查詢(xún)過(guò)程:
1.查詢(xún)當(dāng)前作用域是否有變量a
辨泳;
2.如果有,引用標(biāo)識(shí)符a對(duì)應(yīng)的值(只有聲明的話(huà)為值undefined
)玖院;
3.如果沒(méi)有菠红,會(huì)出現(xiàn)ReferenceError
。