LHS 查詢和 RHS查詢
LHS 查詢:賦值操作的左側(cè)。LHS查詢?cè)噲D找到變量的容器本身您没,從而可以對(duì)其賦值鸟召。
RHS查詢:查找某某某的值。
function foo(a) {
console.log( a ); // 2
}
foo( 2 );
上面這段程序中既有 LHS 也有 RHS 引用氨鹏,把2當(dāng)作參數(shù)傳遞給foo(...)欧募,隱式的發(fā)生了 a=2 的操作,為了給參數(shù) a 分配值仆抵,需要進(jìn)行一次LHS查詢跟继。
這里還有對(duì) a 進(jìn)行的 RHS 引用,并且將得到的值傳給了 console.log(..)镣丑。console.log(..) 本身也需要一個(gè)引用才能執(zhí)行舔糖,因此會(huì)對(duì) console 對(duì)象進(jìn)行 RHS 查詢,并且檢查得到的值中是否有一個(gè)叫作 log 的方法莺匠。
什么是作用域金吗?
作用域是一套規(guī)則,用于確定在何處以及如何查找變量(標(biāo)識(shí)符)。
如果查找的目的是對(duì)變量進(jìn)行賦值摇庙,那么就會(huì)使用 LHS 查詢旱物;如果目的是獲取變量的值,就會(huì)使用 RHS 查詢卫袒。
賦值操作符會(huì)導(dǎo)致 LHS 查詢宵呛。=操作符或調(diào)用函數(shù)時(shí)傳入?yún)?shù)的操作都會(huì)導(dǎo)致關(guān)聯(lián)作用域的賦值操作。
JavaScript 引擎首先會(huì)在代碼執(zhí)行前對(duì)其進(jìn)行編譯夕凝,在這個(gè)過程中宝穗,像 var a = 2 這樣的聲明會(huì)被分解成兩個(gè)獨(dú)立的步驟:
1. 首先,var a 在其作用域中聲明新變量迹冤。這會(huì)在最開始的階段讽营,也就是代碼執(zhí)行前進(jìn)行。
2. 接下來泡徙,a = 2 會(huì)查詢(LHS 查詢)變量 a 并對(duì)其進(jìn)行賦值橱鹏。
LHS 和 RHS 查詢都會(huì)在當(dāng)前執(zhí)行作用域中開始,如果有需要(也就是說它們沒有找到所需的標(biāo)識(shí)符)堪藐,就會(huì)向上級(jí)作用域繼續(xù)查找目標(biāo)標(biāo)識(shí)符莉兰,這樣每次上升一級(jí)作用域(一層樓),最后抵達(dá)全局作用域(頂層)礁竞,無論找到或沒找到都將停止糖荒。
不成功的 RHS 引用會(huì)導(dǎo)致拋出 ReferenceError 異常。不成功的 LHS 引用會(huì)導(dǎo)致自動(dòng)隱式地創(chuàng)建一個(gè)全局變量(非嚴(yán)格模式下)模捂,該變量使用 LHS 引用的目標(biāo)作為標(biāo)識(shí)符宫患,或者拋出 ReferenceError 異常(嚴(yán)格模式下)照宝。