tddjs > 引数もローカル変数なので自由変数

by s_hiroshi

JavaScript

// 外側関数の引数もローカル変数なので
// クロージャーは引数を参照できる。
function foo(value) {
    return function() {
        value = value * 2;
        return value;
    };
}
var c = foo(2);
console.log(c()); // 4
console.log(c()); // 8
console.log(c()); // 16


// クロージャーを使って外部から変更できない変数(外側の引数)を作る
function bar(value) {
    return function() {
        return value;
    };
}

var d = bar(5);
console.log(d()); // 5
d.value = 50; // d関数への新たなプロパティvalueを設定することになりbarの引数valueは変更されない。
console.log(d()); // 5


// getValueはクロージャーになりvalueにアクセスできる
function baz(value) {
    function getValue() {
        return value;
    }
    var o = {
        _get: getValue
    };
    return o;
}
var e = baz(10);
console.log(e._get()); // 100
e.value = 1000; // 外部からはbarの引数valueを直接操作できない。
console.log(e._get()); // 100 特権メソッド_getで参照。