链接jQuery选择器是否有任何负面影响?

时间:2012-04-07 14:53:54

标签: jquery performance jquery-selectors chaining

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

所以,会链接一个这样的陈述:

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

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

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

2 个答案:

答案 0 :(得分:4)

Chaining实际上比这更好:

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

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

答案 1 :(得分: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"元素的隐式引用。

因此,如果从DOM中删除了任何原始".my_class"元素,则由于该引用而无法进行GC。


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

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存活,节点就不会被释放。