JavaScript The Good Partsを読む(その3)
だいぶ間が空きましてすいません。Java+Design Patternやっててそっちも面白かったもので。Java+DPに関しても書いていきたいですね。
では、第4章に関して。この章では関数ということで、関数の呼び出し方やクロージャ、カリー化等が出てきます。
ですが、今日はスコープとクロージャについて書きます。
スコープ
JavaScriptはブロックスコープを持っていません。
代わりに、関数スコープは持っています。
var foo = function () { value: 0 }; // アクセスできない! //document.write(foo.value);
この声質を利用して、プライベートなフィールドを持ちたい場合にクロージャを使う(のだと僕は理解しました。)
クロージャ
書き方はおそらく色々あるんだと思いますが、その一例として。
// 前段階 function outer () { var x = 1; alert('outer x = ' + x); return function () { alert('closure x = ' + x); x = x + 1; }; } //実行するには? var f = outer(); // alert('outer x = ' + x);が実行される f(); // alert('closure x = ' + x);
これではなんだか手間なので、即時関数と呼ばれるものを利用します。即時関数についてはこのテキストには書いてなかったので、こちら等 - http://d.hatena.ne.jp/sandai/20110824/p1 を参考にしてみるといいかもしれません。
// 即時関数使用バージョン var f = (function () { var x = 1; alert('outer x = ' + x); return function () { alert('closure x = ' + x); x = x + 1; }; }()); // 実行するには? f(); // alert('closure x = ' + x);が実行される
即時関数を利用すると、var f = hogehogeの段階で関数が実行されるので、alert('outer x = ' + x);が発動します。
// テキストの例。valueにはincrementを使わないと影響を与えることができない。getValueを使わないと値を取得できない。var myObject = (function () { // 即時関数を変数に代入 var value = 0; return { increment: function (inc) { value += typeof inc == 'number' ? inc : 1; }, getValue: function () { return value; } }; }());
次回予告
次回は多分DPかandroidの話をやります。JS一旦休憩かなー?w