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 入れれ、とのことなので、メモがあれば別でエントリ入れます。