我想知道在没有先检查something
是否已经是jQuery实例的情况下懒惰地执行function foo( element ){
var $element = $( element );
// do something with $element...
}
是否有任何性能下降?
我正在考虑的用例是如下函数:
foo( $( "#somediv" ) );
如果您将jQuery实例传递给该函数,您是否正在使用另一个jQuery实例重新包装jQuery实例?这是否有任何性能影响(例如,经过多次迭代)?
jQuery.fn.init
查看源代码(本问题的v 2.1.4),我们看到jQuery.makeArray
检查传递给它的选择器,如果它不是字符串,DOM元素或函数,那么我们只需将其传递给makeArray
并返回结果。
因此,如果选择器已经是jQuery实例,那么jQuery“构造函数”中似乎没有任何明确的检查。但这真的很重要吗?
merge
使用push
和/或StaleDataError
,因此会有一些额外的处理,但它有意义吗?
答案 0 :(得分:2)
好吧,因为我似乎永远无法离开需要剃须的牦牛,这里是JSPerf test,这似乎暗示检查和短路而不是(意外)重新包装jQuery实例可以将性能提高多达30%。在我的书中,它足以保证丑陋的代码。
以下是两项测试:
function noCheck(element) {
var $element = $(element);
$element.css("color", "red");
}
noCheck($("#somediv"));
function shortCircuit(element) {
var $element = element instanceof jQuery ? element : $(element);
$element.css("color", "red");
}
shortCircuit($("#somediv"));
根据JSPerf,noCheck
执行速度比shortCircuit
在JSFiddle中使用此代码。
我暂时不接受我的回答以鼓励额外的观点/测试等。