JavaScript 中,函數及變數的宣告都會被提升到函數的最頂端。
JavaScript 中,變數可以在使用後聲明,也就是變數可以先使用再聲明。
以下兩個實例將得到相同的結果:
實例1
<!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>
執行程式嘗試
實例2
<!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 只有宣告的變數會提升,並且初始化的不會。
以下兩個實例結果結果不相同:
實例1
<!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變數是一個未定義的變數。
提示
#在頭部宣告你的變數
對於大多數程式設計師來說並不知道JavaScript 變數提升。
如果程式設計師不能很好的理解變數提升,他們寫的程式就容易出現一些問題。
為了避免這些問題,通常我們在每個作用域開始前聲明這些變量,這也是正常的 JavaScript 解析步驟,易於我們理解。