Monthly Archives: 2月 2011

You are browsing the site archives by month.

(javascript)クロージャ

JavaScriptもだいぶわかるようになったなと思ったらつまずきました。

クロージャ

いろいろ調べてみたが、イマイチ頭に入ってこない。。。

実際にコードを書いてみてなんとなくですが、把握できた。

function func1(){
  var x = 0;
  return function(){alert(x); x++;}
}

f = func1();

f(); // 0
f(); // 1
f(); // 2

この場合でいうと「x」の値が保持されているのがみそらしい。
さらにこの「x」に対してアクセスができない。

たとえば、仮に以下のようにしたとしても、
結果は同じ。

function func1(){
  var x = 0;
  return function(){alert(x); x++;}
}

x = 5;
f = func1();

f(); // 0
f(); // 1
f(); // 2

こんなふうにも書いてみた。

function func1(){
  var x = 0;
  return function(){alert(x); x++;}
}

f = func1();

f(); // 0
f(); // 1

g = func1();

g(); // 0
f(); // 2
g(); // 1

f,gはそれぞれ変数宣言したタイミングで、関数と「x」の状態(オブジェクトみたいな?)が入っているような感じか。。。

試に以下のようにしてみると、また結果が変わってくる

function func1(){
  var x = 0;
  return function(){alert(x); x++;}
}

f = func1();

f(); // 0
f(); // 1

g = f;

g(); // 2
f(); // 3
g(); // 4

なんとなく、わかったようなわかっていないような。。。

とりあえず、jsについてまだまだってことがわかったので
オライリーでも買おう。

(参考サイト)
[JavaScript] 猿でもわかるクロージャ超入門 まとめ
JavaScript クロージャとレキシカルスコープ
クロージャ – Wikipedia