JQuery选择器-完全或优化扫描

JQuery selector - full or optimized scan?

本文关键字:优化 扫描 选择器 JQuery      更新时间:2023-09-26

代码示例:

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

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

它首先构建整个列表。我无法想象如何在浏览器/JavaScript引擎中做到这一点,尽管我猜测可能会使NodeList变得懒惰。

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

请注意,现代浏览器支持dom访问函数,这些函数将大量工作推入浏览器内部,因此经常—我想,就像你的选择器一样,它实际上只是

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

浏览器将完整的列表返回给jQuery。这就是为什么我提到将NodeList对象设置为lazy的原因,但我仍然认为考虑到JavaScript的语义,这将是相当困难的。

首先填充元素数组。

因为这真的只是javascript和javascript是单线程的(除了web工作者不被使用在这里,不能访问DOM),它是这样发生的:

这个函数调用被执行到完成:

$JK("body *")

函数返回一个jQuery对象。

.each()

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