yn2011's blog

技術メモ

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なしの宣言で初期化=グローバルスコープに囚われていたので「あれ?」となった

引数に再代入する処理を書くとコードが分かりにくくなると思うので、あまり上のように書くことはないけど...