$(function() { var menu = document.getElementById('my-menu'); $('#run').click(function() { attachEvt(menu); }); }); var attachEvt = function(element) { var mouseHandler = function() { /* whatever */ $('#debug').html('done.'); }; element.addEventListener('mouseover', mouseHandler, false); };
attachEvt の中に mouseHandler をネストさせている。
これは、ハンドラ(mouseHandler) が呼び出し元の attachEvt のスコープ内に閉じ込められることを意味する。
したがって、ハンドラは element への参照を保持し続ける。
element は menu への参照を保持し、menu は div#my-menu への参照を保持する。
さらに div#my-menu はハンドラへの参照を保持している。
これを循環参照(circular reference)という。
参考:JavaScriptの最適化について、code.google.comの記事の適当訳 - それ図解で。・・・tohokuaikiのチラシの裏
Fabulous Adventures In Coding : What are closures?
element.addEventListener - MDC
Copyright © 2009 Serendip. All rights reserved.