どこで働いているかわからない、無名のエンジニアのわりとどうでもいい日記www

ネットデブリ予定地です。。生暖かい目で今後ともヨロシクwww 技術よりも哲学的な内容が多いですww

Javascriptの変数のスコープ

Javascriptバリバリの人からすれば、
ものすごく初歩的なことだろうけど、
Javascriptの変数のスコープがやっとわかった。

今まで適当だったんだけど、
この記事を読んで目からウロコだった。

http://www.atmarkit.co.jp/ait/articles/0708/21/news116.html


まとめると

・すべての変数をvarキーワード付きで定義した方がいい
関数外ではvar付きでもvarなしでもグローバル変数になり、
関数内ではvar付きならローカル変数、varなしならグローバル変数になる

関数内でグローバルにすると混乱するので
恐らく余程の事情がない限りやらないほうがいい


・関数内でのローカル変数の定義は頭で行ったほうがいい
実は関数の途中で定義しても頭で定義していることになっており、
これがために変な挙動になりかねないので頭で行うのが推奨


・参照型の変数はメモリの格納場所を指しており
参照渡しになるので注意

以下ソースを参照

var x = [0, 1, 2];

function ref(x) {
  x[0] = 10;
  return x;
}

window.alert(ref(x)); // [10,1,2]
window.alert(x);      // [10,1,2]

Javascriptの変数はオブジェクトのプロパティのようなもので
現在の関数の中に変数がなければ、外側に変数を探しに行く

これをスコープ・チェーンというらしい

なので以下のソースのような挙動になる。

function myClosure(init) {
  var cnt = init;

  return function() {
    return ++cnt;
  }
}

var result1 = myClosure(1);
var result2 = myClosure(10);

window.alert(result1()); // 2
window.alert(result1()); // 3
window.alert(result2()); // 11
window.alert(result2()); // 12
window.alert(result1()); // 4