使用 $this 而不是 $(this) 是否提供了性能增强?

IT技术 javascript jquery caching this
2021-02-04 21:11:04

假设我有以下示例:

示例一

$('.my_Selector_Selected_More_Than_One_Element').each(function() {
    $(this).stuff();
    $(this).moreStuff();
    $(this).otherStuff();
    $(this).herStuff();
    $(this).myStuff();
    $(this).theirStuff();
    $(this).children().each(function(){
        howMuchStuff();
    });
    $(this).tooMuchStuff();
    // Plus just some regular stuff
    $(this).css('display','none');
    $(this).css('font-weight','bold');
    $(this).has('.hisBabiesStuff').css('color','light blue');
    $(this).has('.herBabiesStuff').css('color','pink');
}

现在,它可能是:

示例二

$('.my_Selector_Selected_More_Than_One_Element').each(function() {
    $this = $(this);
    $this.stuff();
    $this.moreStuff();
    $this.otherStuff();
    $this.herStuff();
    $this.myStuff();
    $this.theirStuff();
    $this.children().each(function(){
        howMuchStuff();
    });
    $this.tooMuchStuff();
    // Plus just some regular stuff
    $this.css('display','none');
    $this.css('font-weight','bold');
    $this.has('.hisBabiesStuff').css('color','light blue');
    $this.has('.herBabiesStuff').css('color','pink');
}

重点不在于实际的代码,而在于$(this)它被使用超过一次/两次/三次或更多次时的使用。

使用示例二使用示例在性能方面是否更好(可能会解释为什么或为什么不)?

编辑/注释

我怀疑两个更好;我有点害怕的是,$this当我不可避免地忘记将 加入$this到事件处理程序时,我会在我的代码中加入一个潜在的难以诊断的错误而不是无意中引入了一个潜在的难以诊断的错误那么我应该使用var $this = $(this), 还是$this = $(this)为此?

谢谢!

编辑

正如 Scott 在下面指出的,这被认为是 jQuery 中的缓存。

http://jquery-howto.blogspot.com/2008/12/caching-in-jquery.html

贾里德

4个回答

是的,绝对使用$this.

每次使用$(this)都必须构造一个新的 jQuery 对象,同时$this保留相同的对象以供重用。


一个性能测试表明,$(this)显著$this但是,由于两者都每秒执行数百万次操作,因此不太可能产生任何实际影响,但无论如何重用 jQuery 对象是更好的做法。真正影响性能的地方是当一个选择器而不是一个 DOM 对象被重复传递给 jQuery 构造函数时 - 例如$('p').


至于使用var,再次总是使用var来声明新的变量。通过这样做,变量将只能在声明它函数中访问,并且不会与其他函数冲突。


更好的是,jQuery 旨在与链接一起使用,因此请尽可能利用这一点。而不是声明一个变量并多次调用它的函数:

var $this = $(this);
$this.addClass('aClass');
$this.text('Hello');

...将函数链接在一起,以使用不必要的附加变量:

$(this).addClass('aClass').text('Hello');
@Box9 - 该性能测试非常有趣。在链接时,它是否提供了仅使用$this代替的性能增强
2021-03-13 21:11:04
@Jared,针对您的澄清问题添加了一些进一步的注释。
2021-03-19 21:11:04
@mdmullinax - 我刚刚添加了一条注释,要求进行同样的澄清。谢谢!
2021-03-27 21:11:04
加油,我希望我能投票两次。编辑是锦上添花。
2021-04-01 21:11:04
还宣布$thisvar $this使$this包含在内部each()范围不在默认全局范围和
2021-04-08 21:11:04

转到带有 jQ​​uery 的页面并在您的控制台中运行它。我知道这很糟糕,但你可以看到 $this 每次都赢了。

var time = new Date().getTime();
$('div').each(function() {
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
});
var now = new Date().getTime();
console.log(now- time);

var var_time = new Date().getTime();
$('div').each(function() {
  var $this = $(this);
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
});
var var_now = new Date().getTime();
console.log(var_now - var_time);
以上内容的修改版本:小心这可能会减慢您的浏览器速度
2021-03-18 21:11:04

是的,如果您多次引用 $(this),您应该将其存储在一个变量中。$this 只是一个约定,让其他人知道 $this 代表一个 jquery 对象。

如果您的 jquery 对象是使用复杂选择器创建的,这一点就更加重要。

此外,在您的伪代码示例中,您通常可以使用 $(this) 上的链接。

例子:

$(this).addClass("someclass").css({"color": "red"});

@Box9 完全正确。我无法告诉你我有多少次重构 jQuery b/c 人们不使用缓存。

我还要补充一点,结合缓存,人们需要学习做到这一点:

var $element = $("#elementId"),
    elementLength = $element.length,
    elementText = $element.text(),
    someString = "someValue",
    someInt = 0,
    someObj = null;

而不是这个:

var $element = $("#elementId");
var elementLength = $element.length;
var elementText = $element.text();
var someString = "someValue";
var someInt = 0;
var someObj = null;
当你说缓存时,你是指Box9的链接示例吗?另外,为什么var在每个之前都没有声明可以提高性能?(我觉得前者很难辨别)
2021-04-02 21:11:04
2021-04-05 21:11:04
@Scott - 哦,好吧,这个$this问题被认为是缓存(我会称它为存储引用,没有跳转到缓存)。您没有回答有关使用 multiplevar的问题。
2021-04-06 21:11:04
2021-04-09 21:11:04
@Jared,var更多的是关于风格。它使代码在某些人和其他人(例如 Douglas Crockford)看来更简洁,重要的是确保var每个函数只有一个
2021-04-09 21:11:04