JavaScript 變數提升
下面的程式是什麼結果?
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> <script type="text/javascript"> var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); </script> </head> <body> </body> </html>
結果彈出: 10
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> <script type="text/javascript"> var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); </script> </head> <body> </body> </html>
#結果彈出:1
嚇你一跳吧?發生了什麼事情?這可能是陌生的,危險的,迷惑的,同樣事實上也是非常有用和印象深刻的JavaScript語言特性 -- 變數提升。
#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>
2.
<!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 解析步驟,易於我們理解。