ES2017 仕様の公式リリース (2017-07-08) の時点で、EcmaScriptはlet
orconst
キーワードを使用して真のブロック スコープをサポートするようになりました。
ECMAscript にはブロック スコープではなく関数スコープがあるため、関数コンテキストの先頭で変数を宣言することをお勧めします。
関数コンテキスト内の任意の時点で変数と関数の宣言を行うことができますが、結果を完全に認識していないと、非常に混乱し、奇妙な頭痛の種になります。
頭痛の例:
var foo = 10;
function myfunc() {
if (foo > 0) {
var foo = 0;
alert('foo was greater than 0');
} else {
alert('wut?');
}
}
何だと思いますか?ここに電話すると警告しmyfunc
ます。これは、ECMAscript インタープリターがステートメントと関数の宣言をコンテキストの先頭に自動的に持ち上げるためです。基本的に、最初の の前に初期化されます。var
foo
undefined
if statement
さらに読む: JavaScript のスコープと巻き上げ