為什麼此程式碼片段會在控制台中給出錯誤「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() 被分開在另一個腳本標記中,所以我得到了一個錯誤,而不是僅僅在控制台中記錄「未定義」。
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
。請改用const
和let
。使用 var 進行提升會導致錯誤,有時很難調試和修復。如果您需要在生產中僅使用var
,只需使用 esbuild 將程式碼降級為適當的舊版本 JS。有趣的是,
const
和let
也有點被提升,但在提升狀態下存取它們會導致執行時間錯誤(這稱為暫時的死區),這就是為什麼它們更安全,因為您會立即收到錯誤,而不是靜默地提升var
,從而給您留下一個您不知道的潛在錯誤。關於顳死區:
https://developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Statements/let#temporal_dead_zone_tdz