搜尋

首頁  >  問答  >  主體

javascript - 關於變數名稱提升的問題?

下面這段程式碼執行後是 undefined

#
<script type="text/javascript">
if (! 'a' in window) {
  var a = 123;
}
console.log(a);
</script>

說明 'a' in windowtrue, 可是 a 在什麼時候宣告的呢?請教大家,謝謝!

我又把程式碼改成:

<script type="text/javascript">
if (! 'a' in window) {
  a = 123;
}
console.log(a);
</script>

結果a is not defined。既然 a 已經聲明,為什麼要報這個錯誤呢?

巴扎黑巴扎黑2762 天前600

全部回覆(5)我來回復

  • 黄舟

    黄舟2017-06-12 09:34:55

    先說變數提升吧

    if (! 'a' in window) {
      var a = 123;
    }
    console.log(a);

    這段程式碼無論是否進入 if 的程式碼區塊內,a 都是存在的

    因為在 JavaScript 執行時,所有透過 var 定義的變數以及宣告式函數都會被提升到目前作用域的頂端

    而透過 var 建立的變數是沒有塊級作用域的,所以會提升到目前函數作用域的頂端

    在全域作用域定義的變數都是 window 的屬性

    所以這段程式碼實際上執行的時候是這樣的順序

    var a;
    if (! 'a' in window) {
      a = 123;
    }
    console.log(a); // undefined 

    定義了 a,但沒有賦值,自然輸出了 undefined

    關於其中! 'a' in window 其實是先對'a' 字串執行,得到了falsewindow 裡沒有falsewindow 裡沒有

    .

    ,沒有進入if 程式碼區塊。

    具體可試試以下範例

    false in window; // false
    
    window.false = 123;
    
    false in window; // true
    
    !false in window; // false
    
    true in window; // false
    
    window.true = 456;
    
    !false in window; // true
    
    'true' in window; // true

    第二個問題

    if (! 'a' in window) {
      a = 123;
    }
    console.log(a); // Uncaught ReferenceError: a is not defined
    看懂了上面這個就很簡單了,沒用 var 定義(不存在提升),又沒進

    if🎜,導致沒有定義 a,報錯。 🎜

    回覆
    0
  • 大家讲道理

    大家讲道理2017-06-12 09:34:55

    這段執行沒毛病啊,! 'a' in window這個是false,然後a的賦值沒執行,再console不就是undefined麼。
    如果想讓賦值執行,判斷條件改成!('a' in window)就行了。

    如果還沒明白,請查一下運算子優先列表。

    回覆
    0
  • 代言

    代言2017-06-12 09:34:55

    var宣告的時候會發生變數提升,在編輯階段就把程式碼宣告放在函數或程式碼開頭,所以就變成這個樣子:

    <script type="text/javascript">
    var a;
    if (! ('a' in window)) {
      a = 123;
    }
    console.log(a);
    </script>

    所以a in windowtrue

    至於

    <script type="text/javascript">
    if (! ('a' in window)) {
      a = 123;
    }
    console.log(a);
    </script>

    程式碼不包含var a。所以不存在變數提升的問題,所以a就沒有宣告過,所以!('a' in window)是true,所以a123

    https://developer.mozilla.org...

    回覆
    0
  • 阿神

    阿神2017-06-12 09:34:55

    你第一段就理解錯了
    'a' in window 你第一段就理解錯了
    'a' in window 你第一段就理解錯了
    'a' in window 為false

    !'a' in window🎜 才為true🎜才會執行🎜var a = 123; 才為true🎜才有被賦值的存在🎜

    回覆
    0
  • 学习ing

    学习ing2017-06-12 09:34:55

    熊貓桑正解啊=_=

    回覆
    0
  • 取消回覆