JQuery选择器 - 完整或优化扫描?

时间:2011-12-11 17:13:55

标签: javascript jquery

代码示例:

$JK("body *").each(function() { ... });

JQuery是否会填充元素'数组首先在调用each()之前或者有点LINQ - 样式优化,以便在DOM树遍历期间调用function?我想这个优化可能(或不)部署到JS引擎中。如果是这样,人们如何知道它是为这个还是那个引擎/浏览器实现的?

2 个答案:

答案 0 :(得分:2)

它首先构建整个列表。我无法想象它是如何在浏览器/ JavaScript引擎中完成的,尽管我猜测可能会使NodeList以某种方式变得懒惰。

jQuery对象看起来像一个Array实例(它不是,但它试图看起来像一个),这意味着你可以通过数字索引随机访问元素。让它变得懒惰真的很蠢。

请注意,现代浏览器支持DOM访问功能,这些功能将大量工作推送到浏览器的内部,因此我经常会这样做 - 我怀疑,在选择器的情况下,这实际上只是

document.getElementsByTagName('body')[0].getElementsByTagName('*')

浏览器将完整列表交还给jQuery。这就是为什么我提到使NodeList对象变得懒惰,但我仍然认为考虑到JavaScript的语义会很难。

答案 1 :(得分:1)

它首先填充元素数组。

因为这实际上只是javascript和javascript是单线程的(除了这里没有使用的web worker并且无论如何都无法访问DOM),它会发生如下:

此函数调用执行完毕:

$JK("body *")

该函数使用

返回一个jQuery对象
.each()
调用

方法。在该方法中,它遍历DOM元素数组并为每个DOM元素调用一次回调函数。