A Re-introduction to JavaScript

手続きオブジェクトの記述がどこで出てくるか、って思ってたのですがようやくソコに到達。以下、所感など。

可変長引数

なんつーか柔軟杉。以下とか想像の範疇外w

function add() {
    var sum = 0;
    for (var i = 0, j = arguments.length; i < j; i++) {
        sum += arguments[i];
    }
    return sum;
}

> add(2, 3, 4, 5)
14

そしてどこで closure が出てくるのかが楽しみ。以下も SICP とかに出てきてそげなナニ。

> var a = 1;
> var b = 2;
> (function() {
    var b = 3;
    a += b;
})();
> a
4
> b
2

と思ったら closure な記述はスルーだった模様。

Closure

と思ったらこんな項がいきなり出現。やっぱりね。最初に出てきてるのが以下な例。

function makeAdder(a) {
    return function(b) {
        return a + b;
    }
}
x = makeAdder(5);
y = makeAdder(20);
x(6)
?
y(7)
?

ええと、x(6) は 11 で y(7) は 27 なのかな。で、例示されてるのはこれだけ、ってことで若干残念な思いをしておったりしてます。

A closure is the combination of a function and the scope object in which it was created.

という記述もあり。

と思ったら

直後の節も closure な節だった。循環参照が云々とのこと。
以下は循環参照してて GC でオブジェクトが解放されないけれど

function addHandler() {
    var el = document.getElementById('el');
    el.onclick = function() {
        this.style.backgroundColor = 'red';
    }
}

対して以下は循環参照ではない例とのこと。

function addHandler(){
    document.getElementById('el').onclick = function(){
        this.style.backgroundColor = 'red';
    }
}

el という変数がカギなのかどうか。ちょっと直感的に理解できないです。
よく見たらこの項でこの文書は終わりらしい。しかももう一つ例示されてるコードがありました。

function addHandler() {
    var clickHandler = function() {
        this.style.backgroundColor = 'red';
    };
    (function() {
        var el = document.getElementById('el');
        el.onclick = clickHandler;
    })();
}

これ、el が 'el' な DOM オブジェクトを捕まえっぱになっちゃう、ということなのか。最後の例と最初の例との違いが答えなのだろうなと。
無名手続きの中のローカル変数内での変数束縛と、addHandler という手続きの中での el という名前による無名手続きの束縛、ということなのかどうか。
とは言え、感覚的に el が解放されなさげ、ってのは分かるのですが、感覚値だなw

次は

Developer Tools 入れれ、とのことなので、メモがあれば別でエントリ入れます。