一言難盡的js變數提升面試題
阿新 • • 發佈:2018-12-13
全域性作用域和區域性作用域
全域性作用域:整個JS執行環境
區域性作用域:通過建立一個函式就開闢出了一個區域性作用域
全域性變數和 區域性變數
全域性變數:在全域性作用域都可以訪問的變數
區域性變數:只能在當前區域性作用域訪問的
變數宣告提升:
如果變數宣告在函式裡面,則將變數宣告提升到函式的開頭
如果變數宣告是一個全域性變數,則將變數宣告提升到全域性作用域的開頭
變數執行(搜尋)機制:
首先看,有沒有區域性作用域
如果有,查詢是不是這個區域性作用域定義的變數
如果不是,尋找上一級作用域,直到找到全域性作用域
如果全域性作用域也找不到這個變數,這個變數就是未定義的 undefined
第一題:
var a=1; function test(){ console.log(a); var a=1; } test();
根據變數宣告提升和變數搜尋機制,函式test()應為
function test(){ var a; console.log(a);//此時由於a並咩有被賦值,所以也就是undefined a=1; }
第二題:
var b=2; function test2(){ window.b=3; console.log(b);//值為3 } test2();
任何通過附加在window上的變數都相當於宣告一個全域性變數,或者是給全域性變數賦值
第三題:
c=5; function test3(){ window.c=3; console.log(c); var c; console.log(window.c); } test3();
根據變數宣告提升和變數搜尋機制:
c=5;//宣告一個全域性變數c function test3(){ var c;//變數宣告提升,宣告一個區域性變數 window.c=3;//改變全域性變數c的值 console.log(c);//由於此時的c是一個區域性變數c,並且沒有被賦值 c就是undefined console.log(window.c);//此時的c就是一個全域性變數c,也就是值為3 } test3();