<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                >[danger]問題一:什么是提升?什么是暫時性死區?var、let 及 const 區別? 對于這個問題,我們應該先來了解提升(hoisting)這個概念。 ~~~ console.log(a) // undefined var a = 1 ~~~ 從上述代碼中我們可以發現,雖然變量還沒有被聲明,但是我們卻可以使用這個未被聲明的變量,這種情況就叫做提升,并且提升的是聲明。 對于這種情況,我們可以把代碼這樣來看 ~~~ var a console.log(a) // undefined a = 1 ~~~ 接下來我們再來看一個例子 ~~~ var a = 10 var a console.log(a) ~~~ 對于這個例子,如果你認為打印的值為`undefined`那么就錯了,答案應該是`10`,對于這種情況,我們這樣來看代碼 ~~~ var a var a a = 10 console.log(a) ~~~ 到這里為止,我們已經了解了`var`聲明的變量會發生提升的情況,其實不僅變量會提升函數也會被提升。 ~~~ console.log(a) // ? a() {} function a() {} var a = 1 ~~~ 對于上述代碼,打印結果會是`? a() {}`,即使變量聲明在函數之后,這也說明了函數會被提升,并且優先于變量提升。 說完了這些,想必大家也知道`var`存在的問題了,使用`var`聲明的變量會被提升到作用域的頂部。 >接下來我們再來看`let`和`const`。 我們先來看一個例子: ~~~ var a = 1 let b = 1 const c = 1 console.log(window.b) // undefined console.log(window. c) // undefined function test(){ console.log(a) let a } test() ~~~ 首先在全局作用域下使用`let`和`const`聲明變量,變量并不會被掛載到`window`上,這一點就和`var`聲明有了區別。 再者當我們在聲明`a`之前如果使用了`a`,就會出現報錯的情況 ![](https://user-gold-cdn.xitu.io/2018/11/18/1672730318cfa540?imageView2/0/w/1280/h/960/format/webp/ignore-error/1) 你可能會認為這里也出現了提升的情況,但是因為某些原因導致不能訪問。 --- 首先報錯的原因是因為存在暫時性死區,我們不能在聲明前就使用變量,這也是`let`和`const`優于`var`的一點。然后這里你認為的提升和`var`的提升是有區別的,雖然變量在編譯的環節中被告知在這塊作用域中可以訪問,但是訪問是受限制的。 --- 那么到這里,想必大家也都明白`var`、`let`及`const`區別了,不知道你是否會有這么一個疑問, >[info] 為什么要存在提升這個事情呢,其實提升存在的根本原因就是為了解決函數間互相調用的情況 ~~~ function test1() { test2() } function test2() { test1() } test1() ~~~ 假如不存在提升這個情況,那么就實現不了上述的代碼,因為不可能存在`test1`在`test2`前面然后`test2`又在`test1`前面。 那么最后我們總結下本題的內容: * 函數提升優先于變量提升,函數提升會把整個函數挪到作用域頂部,變量提升只會把聲明挪到作用域頂部 * `var`存在提升,我們能在聲明之前使用。`let`、`const`因為暫時性死區的原因,不能在聲明前使用 * `var`在全局作用域下聲明變量會導致變量掛載在`window`上,其他兩者不會 * `let`和`const`作用基本一致,但是后者聲明的變量不能再次賦值。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看