為什麼此程式碼片段會在控制台中給出錯誤「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粉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
。請改用 const
和 let
。使用 var 進行提升會導致錯誤,有時很難調試和修復。如果您需要在生產中僅使用 var
,只需使用 esbuild 將程式碼降級為適當的舊版本 JS。
有趣的是,const
和let
也有點被提升,但在提升狀態下存取它們會導致執行時間錯誤(這稱為暫時的死區),這就是為什麼它們更安全,因為您會立即收到錯誤,而不是靜默地提升var
,從而給您留下一個您不知道的潛在錯誤。
關於顳死區:
<body> <script> console.log(x); const x = 10; </script> </body>