除了您列出的两个之外,还有第三种选择:
1: $('#content .someclass')
2: $('.someclass', '#content')
3: $('#content').find('.someclass')
我们可以在不进行任何测试的情况下肯定地说的一件事是#3 比 #2 快。那是因为#2 在内部变成了#3。这是执行此操作的jQuery 源代码。它在init()
真正是 jQuery 构造函数的函数中。经过相当长的一系列测试后,它会检测到您已拨打电话$(selector,context)
并$(context).find(selector)
改为拨打电话:
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
} else {
return this.constructor( context ).find( selector );
}
你可以自己$(context).find(selector)
打电话并避免额外的检查。
所以#2 永远不是最快的代码;#3 将永远击败它。
同样正如@KevinB 指出的那样,#2不是/函数的记录使用。这可能只是文档中的一个疏忽,因为它是对 #3 的直接转换,这是对该函数的记录使用,并且代码多年来一直以这种方式工作。$
jQuery
在任何情况下,即使在记录的案例中,也几乎没有任何理由使用 #2,因为 #3 更快且更容易理解。
#3 与 #1 相比如何?在大多数情况下可能更快,但它可能因浏览器以及特定选择器和页面复杂性而异。jsPerf在这里是你的朋友,但一定要给它一个与重要的页面相似的页面,而不仅仅是一个人为的测试。
div.someclass
vs.也是一样的.someclass
。测试一下看看。
关于,当它们只是普通的 JavaScript 函数调用时$(this)
,这个函数名称有时会让事情看起来很神奇。$
为了便于理解,请尝试使用jQuery
函数名称:
jQuery(this)
现在应该更清楚了,这确实是一个函数调用,而不是某种神奇的语法。使用$(this)
or时$(anything)
也是如此:它始终是函数调用。所以是的,如果您重复使用它,最好将结果保存在变量中:
var $this = $(this);
我唯一的建议是不要命名变量$thisobject
。多余的object
措辞并没有真正使名称更加清晰。$this
其他开发人员会更熟悉一个简单的。或者使用更具描述性的名称可能更好,例如
var $element = $(this);
一般来说,this
并且$this
在 jQuery 代码中被严重过度使用,最好尽可能使用具有简短但描述性名称的普通变量。
考虑这个人为的 jQuery 插件:
jQuery.fn.log = function() {
this.each( function() {
console.log( this );
});
return this;
};
在这个简短的函数中,this
改变了两次含义:首先是 jQuery 对象,然后是该对象的单个元素,然后又是 jQuery 对象。难怪人家有烦恼this
!
相反,您可以使用命名参数来.each()
:
$.fn.log = function() {
this.each( function( i, element ) {
console.log( element );
});
return this;
};
这不那么令人困惑了,如果你需要一个 jQuery 对象用于element
内部函数,你可以用同样的方式来做this
:
var $element = $(element);