JavaScript 變數提升



JavaScript 中,函數及變數的宣告都會被提升到函數的最頂端。

JavaScript 中,變數可以在使用後聲明,也就是變數可以先使用再聲明。

以下兩個實例將會得到相同的結果:

實例

#
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>

<p id="demo"></p>
<script>
x = 5; // 变量 x 设置为 5
elem = document.getElementById("demo"); // 查找元素 
elem.innerHTML = x;                     // 在元素中显示 x
var x; // 声明 x
</script>

</body>
</html>

執行實例»

點擊"運行實例" 按鈕查看線上實例

實例

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>

<p id="demo"></p>
<script>
var x; // 声明 x
x = 5; // 变量 x 设置为 5
elem = document.getElementById("demo"); // 查找元素 
elem.innerHTML = x; 
</script>

</body>
</html>

運行實例»

點擊"執行實例" 按鈕查看線上實例

要理解以上實例就需要理解"hoisting(變數提升)"。

變數提升:函數宣告和變數宣告總是會被解釋器悄悄地被"提升"到方法體的最頂端。


JavaScript 初始化不會提升

JavaScript 只有宣告的變數會提升,初始化的不會。

以下兩個實例結果結果不相同:

實例

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>

<p id="demo"></p>
<script>
var x = 5; // 初始化 x
var y = 7; // 初始化 y
elem = document.getElementById("demo"); // 查找元素 
elem.innerHTML = x + " " + y;           // 显示 x 和 y
</script>

</body>
</html>

執行實例»

#點擊"運行實例" 按鈕查看線上實例


#實例

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>

<p id="demo"></p>
<script>
var x = 5; // 初始化 x
elem = document.getElementById("demo"); // 查找元素 
elem.innerHTML = "x 为:" + x + ",y 为:" + y;           // 显示 x 和 y
var y = 7; // 初始化 y
</script>

</body>
</html>

運行實例»

點擊"運行實例" 按鈕查看線上實例

實例2 的y 輸出了undefined,這是因為變數宣告(var y) 提升了,但初始化(y = 7) 並不會提升,所以y 變數是一個未定義的變數。

實例 2 類似以下程式碼:

var x = 5; // 初始化 x
var y;     // 声明 y

elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y;           // 显示 x 和 y

y = 7;    // 设置 y 为 7

在頭部宣告你的變數

對大多數程式設計師來說並不知道 JavaScript 變數提升。

如果程式設計師不能很好的理解變數提升,他們寫的程式就容易出現一些問題。

為了避免這些問題,通常我們在每個作用域開始前聲明這些變量,這也是正常的 JavaScript 解析步驟,易於我們理解。

NoteJavaScript 嚴格模式(strict mode)不允許使用未宣告的變數。
在下一個章節中我們將會學習到 "嚴格模式(strict mode)"