varなしの宣言(初期化)が関数スコープになる場合について
JavaScriptの変数の宣言文について、何となく気になったこと。
- varなしの宣言で初期化された変数はグローバルスコープ
- これはよく知られている仕様
(function() { foo = 1; })(); console.log(foo); // 1
- varなしの宣言で初期化された(ように見える)変数でも、関数の引数なら関数スコープ
- 関数スコープ内に引数の変数が予め宣言されているような動作っぽい
(function(foo) { foo = 0; })(1); console.log(foo); // Uncaught ReferenceError: foo is not defined
- varなしの宣言で初期化=グローバルスコープに囚われていたので「あれ?」となった
引数に再代入する処理を書くとコードが分かりにくくなると思うので、あまり上のように書くことはないけど...