為什麼在之後創建的變數上使用 console.log() 但在另一個腳本標記中時,我會收到錯誤而不是在控制台中記錄'未定義”?
P粉579008412
P粉579008412 2023-09-12 22:58:00
0
1
555

為什麼此程式碼片段會在控制台中給出錯誤「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粉579008412
P粉579008412

全部回覆(1)
P粉536909186

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

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

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

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

在此處了解 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>
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板