JavaScript 変數(shù)のホイスティング
次の手順の結(jié)果はどうなりますか?
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(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>
結(jié)果が表示されます: 10
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(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>
結(jié)果が表示されます: 1
ショックですよね?どうしたの?これは馴染みがなく、危険で、混亂を招くかもしれませんが、実際には非常に便利で印象的な JavaScript 言語機(jī)能である変數(shù)ホイスティングでもあります。
JavaScriptの初期化は昇格されません
JavaScript 宣言された変數(shù)のみが昇格され、初期化された変數(shù)は昇格されません。
1.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(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中文網(wǎng)(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は、変數(shù)宣言(var y)は昇格されるが、初期化(y = 7)は昇格されないためです。 y 変數(shù)は未定義の変數(shù)です。
head で変數(shù)を宣言します
JavaScript 変數(shù)のホイスティングは、ほとんどのプログラマーには知られていません。
プログラマが変數(shù)プロモーションをよく理解していないと、作成したプログラムに問題が発生しやすくなります。
これらの問題を回避するために、通常は各スコープの開始前にこれらの変數(shù)を宣言します。これは通常の JavaScript 解析ステップでもあり、理解しやすいです。