js之作用域
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 會怎樣呢? --- 大家可以試試哦??
?
更多專業前端知識,請上 【猿2048】www.mk2048.com
總結
- 上一篇: 做个商城吧(〇)
- 下一篇: jQuery 遍历 each()方法