JavaScript 變數和函數提升問題總結

來源:互聯網
上載者:User

標籤:避免   上下   not   eva   define   col   def   AC   java   

一 什麼是JavaScript 變數提升?

-- JS程式運行時,

(a)變數的聲明會被解譯器"提升"到方法體內的頂部,初始化賦值操作不提升按順序執行

(b)函數體內未聲明的變數,解譯器會在函數體外聲明變數,成為全域變數

(c)聲明過的函數,整個函數體會被解譯器提升到方法體的頂部,初始化賦值操作按順序執行

1-1 變數提升

eg:變數的聲明提升,初始化賦值不提升。

<script>    console.log(a);    // undefined    var a=3;           // 若沒有var聲明,會報錯 a is not defined    console.log(a);    // 3    function fn() {       console.log(a);  // undefined        var a = ‘a‘;   //此a為局部變數,沒有這一句上下輸出的結果都變為3      console.log(a);  // a    }    fn();    console.log(a);    // 3</script>

上述代碼相當如下:

<body> <script>    var a;    console.log(a);    // undefined    a=3;               // 若沒有var聲明,會報錯 a is not defined    console.log(a);    // 3    function fn() {       var a;       console.log(a);  // undefined        a = ‘a‘;        //沒有這一句上下輸出的結果都變為3      console.log(a);  // a    }    fn();    console.log(a);  // 3  </script></body>

對比改掉函數中a的var聲明

<script>    console.log(a);    // undefined    var a=3;           // 若沒有var聲明,會報錯 a is not defined    console.log(a);    // 3    function fn() {       console.log(a);  //變成了 3        a = ‘a‘;       //此a變成全域變數,沒有這一句上下輸出的結果都變為3      console.log(a); // a    }    fn();    console.log(a);  //變成了 a</script>

上述代碼相當如下:

 <script>    console.log(a);    // undefined    var a=3;           // 若沒有var聲明,會報錯 a is not defined    console.log(a);    // 3    var a;    function fn() {       console.log(a);  // 3        a = ‘a‘;        //沒有這一句上下輸出的結果都變為3      console.log(a);  // a    }    fn();    console.log(a);    // a </script>

ps:所以為避免調用函數後,可能修改了外部的變數,函數內的變數都要聲明初始化,正常化。

1-2 函數提升

eg:聲明式函數將整個函數體提升到頂部,字面量式函數只提升聲明過的變數

<script>    console.log(f1);         //function f1() {}    console.log(f2);         //undefined    function f1() {}    var f2 = function () {}; //若沒有var聲明,上面結果報錯f2 is not defined    console.log(f2);         //function () {}</script>

上述代碼相當如下:

<script>    function f1() {}         //提前    var f2;                  //提前    console.log(f1);         //function f1() {}    console.log(f2);         //undefined    f2 = function () {};     //若沒有var聲明,上面結果報錯f2 is not defined    console.log(f2);         //function () {}</script>

ps:為避免出現一些意料不到的變數提升的錯誤,在每一個變數的範圍開始之前,聲明並初始設定變數,留意函數體中未聲明的變數自動變成全域變數後,導致的種種情況

 

JavaScript 變數和函數提升問題總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.