在选择器上链接jQuery API调用是否有任何负面影响? 处理性能,设计,对内存泄漏的敏感性的负面影响是我特别感兴趣的。
所以,会链接一个这样的陈述:
$('.myElement').css('color','green')
.attr('title','My Element')
.click(function(){ console.log('clicked') });
让应用程序对上述任何负面影响持开放态度?
我个人对链接jQuery表达式没有任何问题,但是我看到很多人都在抨击链接,我想知道是否有任何避免它的具体好处,或者是否它只是一个可读性和个人风格的问题。
答案 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。
这是一个例子......
// 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
存活,节点就不会被释放。