我可以在宣告 JavaScript 變數之前使用它嗎?


是的,您可以使用一種稱為提升的技術在宣告 JavaScript 變數之前使用它。解析器會在執行函式之前讀取整個函式。

變數在宣告之前似乎被使用的行為稱為提升。

例如,以下程式碼:

rank = 5;
var rank;

上面的程式碼與以下程式碼作用相同:

var rank;
rank = 2;

JavaScript 中的提升允許我們宣告變數、函式或類,這些變數、函式或類會在程式碼執行之前被移動到作用域的頂部,無論它們的作用域是區域性還是全域性。

JavaScript 在執行之前為所有變數和函式分配記憶體。請注意,提升指的是宣告,而不是初始化。

由於變數和函式在程式碼中宣告之前就被使用,因此可能會出現意外錯誤。因此,不建議使用提升。提升對 var、let 和 const 的作用不同。我們可以詳細檢查以下內容。

首先,我們將檢查使用 var 進行提升的示例。稍後我們將詳細檢查變數提升。

示例

<!DOCTYPE html>
<html>
<body>
   <h4>Hoisting Example</h4>
   <p id="output"></p>
   <script>
      x = 10; // Assign 5 to x
      document.getElementById("output").innerHTML = x;
      var x; // Declare x
   </script>
</body>
</html> 

在這裡,我們可以看到我們在宣告 x 變數之前使用了它。

現在,我們將檢查 JavaScript 只提升宣告,而不提升初始化。讓我們看另一個例子

示例

<!DOCTYPE html>
<html>
   <body>
   <h3>Hoists only declarations</h3>
   <p id="output"></p>
   <script>
      x = 10; // initialize x
      document.getElementById("output").innerHTML = x + " , " + y;
      var x; // declare x
      var y = 20; // declare and initialize y
   </script>
</body>
</html> 

在這裡,我們可以檢查提升意味著需要在使用 y 之前對其進行初始化。但是 y 沒有初始化。因此,這沒有被提升。這就是為什麼 y 的值為 undefined。我們可以按照示例 1 中提到的方法正確編寫。

示例

<!DOCTYPE html>
<html>
<body>
   <h1>Hoists only declarations</h1>
   <p id="output"></p>
   <script>
      var x = 10; // Initialize x
      var y; // declare y
      document.getElementById("output").innerHTML = x + " , " + y;
      y = 20; // Initialize y
   </script>
</body>
</html> 

在這裡,變數 y 已宣告,但我們顯示它之前未初始化。

JavaScript 只提升宣告,不提升初始化。

始終注意,在後臺,JavaScript 首先宣告變數併為其初始化值。在 JS 中,未宣告的變數在分配程式碼執行之前不存在。因此,在執行賦值程式碼時,未宣告的變數被視為全域性變數。讓我們更深入地研究變數提升。

let 和 const 提升

我們都知道 let 和 const 是塊作用域的,而不是函式作用域的。let 和 const 是在 ES6 中引入的。我們知道 ES6 不允許未宣告的值。如果我們嘗試在宣告之前使用變數,它將丟擲引用錯誤。與 var 不同,變數不會使用預設值初始化。讓我們看一個例子

示例

<!DOCTYPE html>
<html>
<body>
   <h3>Hoisting with let</h3>
   <p id="output"></p>
   <script>
      try{
         document.getElementById("output").innerHTML = x;
         let x = "Hi";
      } catch(err) {
         document.getElementById("output").innerHTML = err;
      }
   </script>
</body>
</html>

在這裡,我們可以觀察到我們正在嘗試在宣告 x 值之前訪問它。讓我們再看一個關於 let 的例子。

示例

<!DOCTYPE html>
<html>
<body>
   <h2>Hoisting with let</h2>
   <p id="result1"></p>
   <p id="result2"></p>
   <script>
      let x;
      document.getElementById("result1").innerHTML = x;
      x = 5;
      document.getElementById("result2").innerHTML = x;
   </script>
</body>
</html>

現在,讓我們檢查 const。

使用 const 進行提升

與 let 一樣,我們不能在宣告之前使用變數,而且我們不僅需要宣告變數,還需要為其初始化值。否則,它將丟擲 SyntaxError 錯誤。讓我們看一個例子

示例

<!DOCTYPE html>
<html>
<body>
   <h1>Hoisting with const</h1>
   <p> It will throw Uncaought SyntaxError: Missing initializer in const declaration </p>
   <p> To see this error please open the Console of the browser </p>
   <p id="output"></p>
   <script>
      const x;
      document.getElementById("output").innerHTML = x;
      x = 5;
      document.write(x);
   </script>
</body>
</html> 

宣告時需要初始化值。

示例

<!DOCTYPE html>
<html>
<body>
   <h2>Hoisting with const</h2>
   <p id="output"></p>
   <script>
      try{
         document.getElementById("output").innerHTML = x;
         const x = 5;
      }catch(err){
         document.getElementById("output").innerHTML = err;
      }
   </script>
</body>
</html> 

與上述示例一樣,const 也無法實現。它將丟擲引用錯誤。

現在,讓我們看看函式的提升。

函式提升

函式提升允許我們在定義函式之前呼叫它。讓我們看一個例子

示例

<!DOCTYPE html>
<html>
<body>
   <h2>Hoisting with function</h2>
   <p id="output"></p>
   <script>
      getName("Devika");
      function getName(name) {
         document.getElementById("output").innerHTML = ("Employee name is " + name);
      }
   </script>
</body>
</html> 

如果將函式表示式賦值給變數。輸出將取決於變數範圍。像這樣:

示例

<!DOCTYPE html>
<html>
<body>
   <h2>Hoisting with function as var</h2>
   <p id="output"></p>
   <script>
      try{
         getName("Devika");
         var getName = function (name) {
         document.getElementById("output").innerHTML = ("Employee name is " + name);
      }
      }catch(err){
         document.getElementById("output").innerHTML = err;
      }
   </script>
</body>
</html>

示例

<!DOCTYPE html>
<html>
<body>
   <h2>Hoisting with function as let</h2>
   <p id="output"></p>
   <script>
      try{
         getName("Devika");
         let getName = function (name) {
            document.getElementById("output").innerHTML = ("Employee name is " + name);
         }
      }catch(err){
         document.getElementById("output").innerHTML = err;
      }
   </script>
</body>
</html>

示例

<!DOCTYPE html>
<html>
<body>
   <h2>Hoisting with function as const</h2>
   <p id="output"></p>
   <script>
      try{
         getName("Devika");
         const getName = function (name) {
            document.getElementById("output").innerHTML = ("Employee name is " + name);
         }
      }catch(err){
         document.getElementById("output").innerHTML = err;
      }
   </script>
</body>
</html>

在這裡我們可以觀察到,帶有變數的函式的工作方式不同。如果我們將函式表示式賦值為 var,我們將得到 TypeError,而使用 let 和 const,我們將得到 ReferenceError。

但是,在宣告之前使用函式是我們的個人喜好問題。

希望本教程能讓你瞭解 js 中的提升以及提升如何與變數和函式一起工作。

更新於:2022年12月8日

3000+ 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告