搜尋

首頁  >  問答  >  主體

為什麼在之後創建的變數上使用 console.log() 但在另一個腳本標記中時,我會收到錯誤而不是在控制台中記錄“未定義”?

為什麼此程式碼片段會在控制台中給出錯誤「Uncaught ReferenceError: x is not Defined

<body>
    <script>
        console.log(x);
    </script>
    
    <script>
        var x = 10;
    </script>
</body>

而這個記錄「未定義」?

<body>
    <script>
        console.log(x);
        var x = 10;
    </script>
</body>

我試圖了解變數宣告和變數範圍。並預計會發生提升,因為整個程式碼都在同一頁中。但因為 console.log() 被分開在另一個腳本標記中,所以我得到了一個錯誤,而不是僅僅在控制台中記錄「未定義」。

P粉579008412P粉579008412523 天前583

全部回覆(1)我來回復

  • P粉536909186

    P粉5369091862023-09-13 00:07:23

    var 被提升,這意味著它可以在定義它的範圍的開頭訪問,即使聲明行可能位於範圍的末尾。如果您在聲明之前訪問該 var,則它是 未定義,因為您仍然需要執行聲明,並可能將該變數初始化為特定值。 所以你的第二個例子就是這樣運作的。

    在此閱讀有關提升的資訊:

    https://developer.mozilla.org/en-US/docs /術語表/起重

    但是在第一個範例中2 有2 個不同的作用域,因此第一個腳本中基本上不存在var ,因此錯誤not Defined 。 < /p>

    在此處了解 var 及其範圍:

    https://developer.mozilla.org /en-US/docs/Web/JavaScript/Reference/Statements/var

    重要 我強烈反對使用 var。請改用 constlet。使用 var 進行提升會導致錯誤,有時很難調試和修復。如果您需要在生產中僅使用 var,只需使用 esbuild 將程式碼降級為適當的舊版本 JS。

    有趣的是,constlet有點被提升,但在提升狀態下存取它們會導致執行時間錯誤(這稱為暫時的死區),這就是為什麼它們更安全,因為您會立即收到錯誤,而不是靜默地提升var ,從而給您留下一個您不知道的潛在錯誤。

    關於顳死區:

    https://developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Statements/let#temporal_dead_zone_tdz

    #
    <body>
        <script>
            console.log(x);
            const x = 10;
        </script>
    </body>

    回覆
    0
  • 取消回覆