JavaScriptの変数宣言と関数宣言におけるスコープ決定ルールとは
JavaScriptのスコープでは、全ての変数(var)と関数宣言は、コードの実行前に現在のスコープの一番上に移動します。つまり、宣言より前にそれらの変数と関数を使っても、未定義エラーは発生しません。
具体的に言うと、変数宣言はホイスティングされるが、変数への代入はホイスティングされない。例:
console.log(x); // 输出 undefined
var x = 5;
上記のコードでは、変数xの宣言はスコープの先頭に持ち上げられるため、xを使用する前にエラーは発生しませんが、代入文は持ち上げられないため、出力はundefinedになります。
関数の宣言では、関数名だけではなく、関数本体全体がホイスティングされます。たとえば、
myFunction(); // 调用函数,输出 "Hello World!"
function myFunction() {
console.log("Hello World!");
}
上記のコードでは、関数の宣言はスコープの一番上に移動するため、関数を呼び出す前にエラーが発生しません。
関数宣言のホイスティングは、変数宣言のホイスティングより優先される点に注意
myFunction(); // 调用函数,输出 "Hello World!"
var myFunction = function() {
console.log("Hello World!");
}
上記のコードにおいて、関数の宣言はスコープの一番上に上がってしまうので、関数を呼び出す前にエラーにはならない。 しかし、変数の宣言は代入よりも先に上がるので、変数 myFunction は代入される前に上げられ、自身が関数ではなくundefinedが呼ばれてしまう。