LHS和RHS的概念也是最近從掘金學(xué)習(xí)到的酌媒,LHS是指Left-hand Side牛哺,而RHS是指Right-hand Side。二者區(qū)別就是關(guān)于作用域?qū)ψ兞康牟樵兡康氖?strong>變量賦值還是查詢摹恨≡逄牵 LHS也就是可以理解為變量在賦值操作符(=)的左側(cè),
例如 a = 1
,當(dāng)前引擎對(duì)變量a查找的目的是變量賦值叮喳”环迹 RHS可以理解為變量在賦值操作符(=)的右側(cè),
例如:var b = a
其中引擎對(duì)變量a的查找目的就是查詢馍悟∨媳簦 那么對(duì)于下面一個(gè)簡單的語句:
var a = 1;
對(duì)于上述語句,可以分解成一下兩步:
1 . var a;
2 . a=1
首先第一步執(zhí)行LHS赋朦,引擎通知詞法作用域篓冲,查詢對(duì)應(yīng)的作用域中是否存在該變量a李破,詞法作用域發(fā)現(xiàn)當(dāng)前作用域中不存在變量a,則在當(dāng)前作用域中聲明變量a;然后第二步執(zhí)行RHS壹将,對(duì)查詢到的變量a進(jìn)行賦值嗤攻。
在舉一個(gè)例子:
function fn(a){
console.log(a+b);
b=a;
}
fn(2);
編譯器對(duì)console.log()
中的b執(zhí)行的是RHS查詢,如果查詢不到的話诽俯,會(huì)拋出ReferenceError的錯(cuò)誤妇菱。如果在執(zhí)行LHS中查詢不到對(duì)應(yīng)的變量,在非嚴(yán)格模式下會(huì)創(chuàng)建變量并且進(jìn)行賦值暴区,如果在執(zhí)行RHS查詢的過程中闯团,對(duì)查詢到的變量操作不正確,例如對(duì)非函數(shù)(undefined,null)執(zhí)行函數(shù)操作時(shí)仙粱,會(huì)報(bào)出TypeError的錯(cuò)誤房交。
這樣就合理的解釋了下面的例子
(function(){
a=100;
})();
console.log(a);//100
之前的理解是如果不對(duì)變量a采用var聲明的時(shí)候,自動(dòng)創(chuàng)建的是全局變量伐割,其實(shí)現(xiàn)在我們就可以合理的解釋候味,首先a=100對(duì)變量a執(zhí)行的是LHS查詢,當(dāng)前作用域中不存在a,會(huì)一直向上查找隔心,直到全局作用范圍中仍然無法找到該變量白群,因?yàn)槭窃诜菄?yán)格模式下(嚴(yán)格模式會(huì)直接報(bào)ReferenceError的錯(cuò)誤),所以編譯器會(huì)自動(dòng)在全局范圍中創(chuàng)建變量a硬霍,并賦值100帜慢,這樣我們所觀察到的結(jié)果就是在全局范圍中創(chuàng)建了變量a。