1.什麼是作用域 作用域是用於收集存儲維護變數,以及當前執行代碼聲明的變數所擁有的許可權, 例如 : function foo(a){ console.log(a); 1 }; foo(666); console.log(a); 2 此時執行該段代碼 1 -- 處列印我們得到 666 因為在函數中聲明 ...
1.什麼是作用域
作用域是用於收集存儲維護變數,以及當前執行代碼聲明的變數所擁有的許可權,
例如 :
function foo(a){
console.log(a); -------- 1
};
foo(666);
console.log(a); ------- 2
此時執行該段代碼
1 -- 處列印我們得到 666 因為在函數中聲明瞭 a 參數 且執行foo函數像裡面傳入666就相當於將a賦值為666 所以console.log 查詢a可以獲得666
2 --處列印我們獲取一個報錯 Uncaught ReferenceError: a is not defined 說a沒有定義,這是為什麼呢.
2.1 首先我們來說明下LHS 查詢和RHS查詢(書上給的解釋是: 賦值操作的左側或右側)
我的理解是
LHS --- 被賦值的變數
RHS --- 查詢變數的值
且這兩種查詢都是從本身所在作用域向上冒泡查詢直到遇到定義的變數位置,
不同的是 :
1.RHS 在本作用域查詢變數遇到不存在需要查詢的變數則逐級向上一級作用域查詢,查到則停止,否則直到到window作用域還沒有查到則會返回一個 xxx is not defined
2.LHS 在本作用域查詢變數遇到不存在需要查詢的變數則逐級向上一級作用域查詢,查到則停止, 到window作用域還沒有查到則會預設再window 全局變數處偷偷的創建這個需要查詢的變數
下麵用一段簡單的代碼來說明 LHS 和 RHS
function foo1(a){
console.log(g)
//這裡將會出現報錯 g is not defined 因為這裡執行的RHS查詢 ,在查詢g的時候發現foo作用域沒有,所以向他的上一級window對象內查詢也沒有存在,所以返回not defined
console.log(a+g);
g = a;
}
foo1(666);
function foo2(a){
g = a;
//在FOO2函數中 a向g賦值 此時g在foo2作用域中也不存在,他也向上查詢,遇到window對象,發現其中也沒有定義g 變數,但是此時呢他就在window對象中創建了一個g對象,所以window對象中就有這個變數
console.log(a+g); ----- 列印控制台獲得 4
}
foo2(2);
//如果將foo2中 g = a 換成 a = g 會怎樣呢 --- 大家可以試試哦