【问题标题】:What does $($(this)) mean?$($(this)) 是什么意思?
【发布时间】:2014-02-10 07:16:25
【问题描述】:

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

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

$($(this)) 有什么用,这里为什么需要这样做?

【问题讨论】:

  • 改成$(this),结果一样
  • 这意味着一些白痴认为他会安全并把它包裹两次。
  • 意思是——“谁让那个代码被提交?”
  • 另请注意,将$(this) 分配给局部变量一次比多次分配$(this) 更有效。
  • 就是我们所说的迷信代码。

标签: javascript jquery


【解决方案1】:

是的,$($(this))$(this) 相同,jQuery()$() 函数非常棒 idempotent。没有理由使用这种特殊结构(this 的双重包装),但是,我用作仅从包含类似双重包装的组中获取第一个元素的快捷方式是

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

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

document.querySelectorAll('selector')[0];,差不多 document.querySelector('selector');

【讨论】:

  • 谢谢。我想这就是我一直在寻找的。我在整个网络上都看到了这一点,现在我更加了解与双重包装有关的案例。
  • 不完全是幂等的。如果给定相同的输入,幂等函数总是返回相同的结果,因此纯函数自然是幂等的。例如,square(x) 是幂等的,但是调用 square(square(x)) 会返回一个不同的结果给 square(x)。从这个意义上说,jQuery 比较擅长模棱两可,而不是幂等性。
  • 坦率地说,我发现$($('selector')[0])$('selector:eq(0)') 甚至$('selector:first') 更难阅读,而且由于双重“构造函数”,它的性能会更差。
  • 欧文,我相信你把幂等性和注入混淆了。检查IdempotenceInjection。无论如何,$() 通常不是幂等的,但是如果参数是 jquery 对象,它将返回它接收到的对象。
  • 如果我想只检索第一个元素作为 jquery 对象,我个人更喜欢$('selector').eq(0)
【解决方案2】:

您可以随意包装$,它不会改变任何东西。

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

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

这就是为什么$($(this)) 将返回与$(this) 完全相同的原因。

【讨论】:

    【解决方案3】:

    没有特别需要双重包装,$($(this))$(this) 完全相同。

    也就是说,我曾经在我的项目的一个文件中发现了这种双重包装,由另一位开发人员提交。通过修订跟踪更改,结果它以$($(this).find('selector').first()) 开头 - 即包装了一些选择器的结果以创建一个新对象。然后无论出于何种原因,选择器被删除,只剩下this 的双重包装。不用说,在下一次提交时,它已更改为 $(this)

    【讨论】:

      【解决方案4】:

      正如我之前所解释的,$($(this))$(this) 绝对相同。如果您尝试多次包装,jQuery 会返回相同的 jQuery 对象。

      此外,出于性能考虑,重用 jQuery 对象是一种很好的做法 - 创建 jQuery 对象非常昂贵,尤其是那些具有复杂选择器的对象。示例:

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

      只需在谷歌上搜索“jQuery 最佳实践” - 您将需要 30 分钟的时间来学习这些基础知识,您将更有效地使用 jQuery。

      【讨论】:

        【解决方案5】:

        这样做没有意义。

        以下代码返回相同:

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

        一个布尔值,取决于所选元素是否具有 footer_default 类:

        .hasClass( className )返回:布尔值

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

        【讨论】:

          【解决方案6】:

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

          这两者没有区别。

          【讨论】:

            猜你喜欢
            • 2011-08-22
            • 1970-01-01
            • 2018-10-29
            • 2011-06-20
            • 2012-05-04
            • 2013-03-29
            • 1970-01-01
            • 2017-07-09
            • 2012-09-17
            相关资源
            最近更新 更多