我想知道,如果我把一个变量设置为一个 jQuery 查询,它会立即执行还是延迟到控制流首次尝试访问其结果元素时(比如对其进行迭代)?
换句话说:一个变量是存储查询本身还是存储结果呢?
例如:
var $query = $('myselector'); // Is it traverses the DOM this time or later when actually using this variable?
查询立即执行,并将结果存储在jQuery对象中。jQuery对象是一个类似数组的对象,包含对找到的元素的引用。
如果您稍后添加了另一个应包括在选择器中的元素,则jQuery对象中的结果不会更改。它仍然只包含在执行查询时找到的元素。
相比之下,像getElementsByName
这样的一些DOM方法返回一个动态的NodeList
集合,如果您添加或删除与名称匹配的元素,该集合会发生变化。
jQuery不是LINQ。当您调用$('myselector')
时,它会被转换为对document.querySelectorAll
的调用,该函数返回一个节点列表。没有延迟加载。该列表也不是“实时”的。它代表了DOM在那个时间点的状态。因此,如果您更改它(添加节点、删除节点),则您的列表不会被修改。它代表了选择器被调用时DOM的状态。Mozilla在MDN 这里上有很好的解释。
另外需要注意的是,除了调用document.querySelectorAll
之外,有时候jQuery必须使用Sizzle引擎自己处理选择器。当您使用某些扩展而这些扩展不是querySelectorAll
支持的一部分,或者您正在使用不具备此功能的浏览器时,就会发生这种情况。其中一个例子是:eq(N)
伪类。这不是querySelectorAll
的一部分,因此jQuery会完成所有繁重的工作。请注意,即使所有工作都由Sizzle完成,它仍然会立即执行并返回与选择器匹配的非实时节点列表。
querySelectorAll
的浏览器中,或者如果查询包含 jQuery 特定的选择器,则将使用 Sizzle 查询引擎。 - Guffa