JavaScript經典做用域問題

  1. 題目javascript

    var a = 10;
    function test(){
        a = 100;
        console.log(a);
        console.log(this.a);
        var a;
        console.log(a);
    }
    test();

    答案:100,10,100
    解析:Javascript在執行前會對整個腳本文件的聲明部分作完整分析(包括局部變量),從而肯定變量的做用域,因此在函數test執行前,因爲第6行聲明瞭局部變量a,因此函數內部的a都指向已經聲明的局部變量,因此第4行輸出100。第5行輸出this.a,咱們都知道,函數內部的this指針指向的是函數的調用者,在這裏函數test被全局對象調用,因此this指針指向全局對象(這裏即window),因此this.a = window.a,一開始生命了全局變量a=10,因此第5行輸出結果爲10。第7行輸出結果爲100,由於局部變量a在第3行已經被賦值了100,因此直接輸出局部變量a的值。html

  2. 題目java

    var a = 100;
    function test(){
        console.log(a);
        var a = 10;
        console.log(a);
    }
    test();

    答案:undefined ,10
    解析:看了第1個例子,可能有同窗會認爲輸出結果是10 10,可是結果卻不是10 10,爲何呢?仔細看第1個例子解析的第一句話,Javascript在執行前會對整個腳本文件的聲明部分作完整分析(包括局部變量),可是不能對變量定義作提早解析,在這個函數中,執行第3行前,能夠認爲已經聲明瞭變量a,可是並無定義(這裏即賦值),因此第3行輸出結果爲undefined,執行第4行a =10後,變量a的值就爲10,因此第5行輸出結果爲10。面試

  3. 題目函數

    var a = 100;
    function test(){
        console.log(a);
        a = 10;
        console.log(a);
    }
    test();
    console.log(a);

    答案:100 10 10
    解析:咱們知道在函數內部,通常用var聲明的爲局部變量,沒用var聲明的通常爲全局變量,在test函數內,a=10聲明瞭一個全局變量,因此第3行的a應該輸出全局變量的值,而在函數執行以前已經聲明過一個全局變量並賦值100,因此這裏第上輸出100。第4行給全局變量a 從新賦值10,因此全局變量a的值變成10,因此第5行輸出10。而在函數test外部,第8行輸出全局變量a的值,由於全局變量被從新賦值爲10,因此輸出結果即爲10。this

注:本文轉自 javascript經典面試題 全局變量和局部變量 變量做用域
如需轉載,請註明出處:http://www.javashuo.com/article/p-ryjxdwww-gs.html.net

相關文章
相關標籤/搜索