1. 程式人生 > >一言難盡的js變數提升面試題

一言難盡的js變數提升面試題

全域性作用域和區域性作用域

全域性作用域:整個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();