最近、JavaScript コードでメモリ リークを探していました。いくつかの重大なリークを見つけた後、マイナーなものを探し始め、潜在的なリークの可能性があるものを見つけました - 「hoverIntent.js」プラグイン。これは本当にリークなのか、それとも私が少し熱心すぎるのでしょうか?
コードの一般的なスキーマ (完全なコードはこちらhttp://cherne.net/brian/resources/jquery.hoverIntent.js ):
(function($) {
$.fn.hoverIntent = function(f,g) {
//...
var track = function(ev) {
cX = ev.pageX;
cY = ev.pageY;
};
var compare = function(ev,ob) {
//... function body
};
var delay = function(ev,ob) {
//... function body
};
var handleHover = function(e) {
//... function body
};
return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover);
};
})(jQuery);
多くの js プラグインがそのように記述されていることは知っていますが、オブジェクトを呼び出すたびにそれを正しく取得するとhoverIntent
、3 つの新しい関数 (クロージャー) が作成されますか? メモリ リーク (または少なくともパフォーマンスの問題) の可能性はありませんか?
次のように書いたほうがよいのではないでしょうか。
(function($) {
//create the methods only once on module init?
var track = function(ev) {
cX = ev.pageX;
cY = ev.pageY;
};
var compare = function(ev,ob) {
//... function body
};
var delay = function(ev,ob) {
//... function body
};
var handleHover = function(e) {
//... function body
};
$.fn.hoverIntent = function(f,g) {
//no closures here
return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover);
};
})(jQuery);