4

在选择器上链接 jQuery API 调用是否有任何负面影响?处理性能、设计、内存泄漏敏感性的负面影响是我特别感兴趣的。

因此,将链接这样的语句:

$('.myElement').css('color','green')
               .attr('title','My Element')
               .click(function(){ console.log('clicked') });

让应用程序对上述任何负面影响保持开放?

我个人对链接 jQuery 表达式完全没有任何问题,但是我看到很多人 bash 链接,我想知道避免它是否有任何具体的好处,或者它是否只是可读性和个人风格。

4

2 回答 2

4

链接实际上比这样做更好:

$('.myElement').css('color','green')
$('.myElement').attr('title','My Element')
$('.myElement').click(function(){ console.log('clicked') });

因为这样做会使 jquery '跳转到池中'寻找我的元素 3 次,而如果你链接你的订单它只会在池中查找一次(注意池是 DOM :)

于 2012-04-07T15:01:29.327 回答
2

链接只是在返回的对象上调用方法。本质上没有什么好或坏的。有些人喜欢,有些人不喜欢。


关于内存泄漏,当您完成 DOM 遍历时,jQuery 确实保留了一组缓存的 jQuery 对象。这与链接并没有太大关系,因为引用的 jQuery 对象会做同样的事情,但我想如果你保持对该对象的永久引用,它可能会导致泄漏。


例如,如果您这样做...

var jq_obj = $('.my_class').parents('.another_class');

... jQuery 对象现在具有对具有该类的".my_class"元素的祖先的引用。".another_class"

问题是你可以这样做......

jq_obj.end();

...您现在可以参考".my_class"所选的原始元素。这意味着保留了原始参考。


因此,如果在调用 之后.parents(),如果您停在那里(没有调用.end(),并且如果您保留对该jq_obj对象的全局引用,那么您现在将隐式引用".my_class"除元素之外的所有".another_class"元素。

因此,如果".my_class"从 DOM 中删除任何原始元素,则由于该引用,它们不能被 GC'd。


这是一个例子......

http://jsfiddle.net/aUEFc/

   // select "my_class" then traverse to a parent
var jq_obj = $('.my_class').parents('.another_class');

   // remove "my_class" elements from the DOM
$('.my_class').remove();

   // see if we still have a reference to "my_class" elements
var len = jq_obj.prevObject.filter('.my_class').length;

即使删除了元素,该len变量也将是选择的元素的原始数量。".my_class"".my_class"

即使我们的jq_obj对象正在引用".another_class"元素,情况也是如此。原因是该.prevObject属性引用了进行原始 DOM 选择的 jQuery 对象,因此只要节点存在,就永远不会释放节点jq_obj

于 2012-04-07T15:52:48.140 回答