$($(this))是什么意思?

52

我在网上看到一些代码使用了以下语句

if ($($(this)).hasClass("footer_default")) {
      $('#abc')
        .appendTo($(this))
        .toolbar({position: "fixed"});
    }

$($(this))的作用是什么,为什么在这里需要使用它?


3
改成 $(this) 就可以得到相同的结果。 - Adil
74
意思是有些蠢货认为他这样包装两层就更安全了。 - adeneo
14
这意味着 - “谁允许提交那段代码?” - user2864740
5
请注意,将 $(this) 分配给一个本地变量一次比多次使用 $(this) 更有效率。 - Alvin Wong
9
这是我们所称的迷信代码。 - Boann
显示剩余7条评论
6个回答

78

是的,$($(this))$(this) 是一样的,jQuery() 或者 $() 函数是非常幂等的。然而,这种特定的构造(双重包装的 this)没有什么理由,不过我使用它作为一个快捷方式来仅仅获取组中的第一个元素,这涉及到类似的双重包装,如下:

$($('selector')[0])

它的意思是,选择与 selector 匹配的每个元素(返回一个 jQuery 对象),然后使用 [0] 来获取列表中的第一个元素(返回一个 DOM 对象),然后再次使用 $() 将其包装回一个 jQuery 对象,这次只包含一个元素而不是一个集合。它大致相当于:

document.querySelectorAll('selector')[0];,这几乎等同于 document.querySelector('selector');


1
谢谢。我认为这就是我正在寻找的东西。我已经在网上看到过这种情况,现在我更加意识到与双重包裹相关的情况。 - guest
2
不完全是幂等的。幂等函数总是在给定相同输入时返回相同的结果,因此纯函数自然是幂等的。例如,square(x) 是幂等的,但调用 square(square(x)) 将返回与 square(x) 不同的结果。从这个意义上讲,jQuery 更擅长于模棱两可,而不是幂等性。 - Owen
3
е°ұжҲ‘дёӘдәәиҖҢиЁҖпјҢзӣёжҜ”дәҺ$('selector:eq(0)')жҲ–иҖ…$('selector:first')пјҢжҲ‘и®Өдёә$($('selector')[0])йҡҫд»Ҙйҳ…иҜ»пјҢдё”жҖ§иғҪиҫғе·®пјҢеӣ дёәе®ғдҪҝз”ЁдәҶеҸҢйҮҚ"жһ„йҖ еҮҪж•°"гҖӮ - UweB
8
欧文,我相信你把幂等性和单射混淆了。请查看幂等性单射函数。无论如何,$()通常不是幂等的,但如果参数是一个jQuery对象,它将返回接收到的对象。 - Luis Carvalho
3
如果我只想获取第一个元素作为 jQuery 对象,个人更喜欢使用 $ ('selector').eq(0) - George
显示剩余5条评论

29

无论你把 $ 包裹多少次,它都不会改变任何东西。

如果 foo 是一个 DOM 元素,$(foo) 将返回相应的 jQuery 对象。

如果 foo 是一个 jQuery 对象,$(foo) 将返回同一个对象。

这就是为什么 $($(this)) 返回的结果与 $(this) 完全相同。


8

没有必要进行双重包装,$($(this))$(this)完全相同。

尽管如此,在我的项目中,我曾经发现另一个开发人员在一个文件中使用了双重包装。通过版本跟踪更改,结果发现它最初是$($(this).find('selector').first()) - 也就是说,某个选择器的结果被包装成一个新对象。然后由于某些原因,选择器被删除,只剩下this的双重包装。不用说,在下一次提交时,它被更改为$(this)


6

如前所述,$($(this))$(this)是完全相同的。如果您尝试多次包装它,则jQuery将返回相同的jQuery对象。

此外,出于性能考虑,重用jQuery对象是一个好习惯 - 创建jQuery对象非常昂贵,特别是具有复杂选择器的对象。例如:

var $this = $(this);
if ($this.hasClass("footer_default")) {
    $('#abc')
        .appendTo($this)
        .toolbar({position: "fixed"});
}

只需在Google上搜索'jQuery最佳实践'-这将花费您30分钟时间来学习这些基础知识,您将更有效地使用jQuery。


3

$(this)$($(this)) 都返回 jQuery 对象。

这两者之间没有区别。


3

这样做没有意义。

以下代码返回相同结果:

console.log($($(this)).hasClass("footer_default"))
console.log($(this).hasClass("footer_default"))

根据所选元素是否具有类名footer_default,返回布尔值:

.hasClass( className )返回:布尔值

示例:http://jsfiddle.net/IrvinDominin/aSzFn/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接