Life goes on

何かJavaScriptとかVimとかMacとかに関係してそうな深淵から覗かれる者

Javascriptのクロージャを再確認したい

今日はちょっとJavascriptのクロージャについて、どんな物か答える機会があったんですが、サイ本の中でもちょっと難しいなあと思いパラパラとしか読んでなかったんで、聞かれた際に「ク、クロージャ…あたい…じゃなかった値を保持する為の関数だっけ…ラ、lambda!(←これは再帰じゃないっけか)」と頭の中でちょっとパニックになってしまい勉強不足を痛感したので、改めてサイ本を開いて、ここに自分なりの解釈をメモしとく。熱は鉄い内に打っておかないと。

function hoge (x) {
  return function() { return x;}
}
  • じゃあこの関数を何回か呼び出すとどうなりますか?出てこいや!
var a = [hoge(0), hoge(1), hoge(2)];
alert(a[0]()); // 0
alert(a[1]()); // 1
alert(a[2]()); // 2
  • 同じ関数なのに値が違う。それぞれ入れた引数が保持されとる!ウララー!

とっさに思った事はそれ程間違いじゃなかったようです。同じ関数でも、関数の呼び出し時に違うスコープを参照してるので値が違うと…。ただし、Globalとして使用するとずっとCallオブジェクトに残りっぱなしになるので、名前空間で衝突の恐れがある…って事でいいのかな?

もっと大事な事

IEだとドキュメント要素←→コアJavascriptというように参照が循環するとガベージコレクションされなくなってしまう。
Callオブジェクトの引数やlocal変数も、そのまま残っちゃう。ある意味メモリの大判振舞い。おう、メモリリーク…なので、気をつけないと。

もう少し名前空間とかスコープチェーンなんかを勉強しないといかん。というかこの解釈で合ってるのかな?