assaulter's diary

主にバイクについて

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