【问题标题】:Why does $($) crash my page?为什么 $($) 会使我的页面崩溃?
【发布时间】:2013-01-27 08:17:56
【问题描述】:

免责声明:请勿在家尝试


如果我使用 jQuery,为什么$($) 会冻结页面?

【问题讨论】:

  • 美元是一个函数。如果你自己调用它,它会陷入无限递归。
  • 为什么这个问题需要保护?
  • 我应该称它为“jQueryCursion”或“jQueRecursive”!

标签: javascript jquery


【解决方案1】:

$($) 是$(document).ready($) 的快捷方式。因此,它将运行该函数(当 DOM 准备好时或直接在这种情况下运行)。

为方便起见,传递给.ready 的函数被传递给jQuery 函数(在noConflict 模式下特别有用)。因此,$($) 将调用 $ 并以 $ 作为参数 - 一切都会再次发生,这是无休止的递归。


另一种解释:

  1. 你打电话给$($)。
  2. jQuery 将函数参数 ($) 添加到内部 ready 列表中。
  3. 一段时间后,jQuery 看到 DOM 已准备就绪,并认为:“让我们调用 ready 列表中的所有函数吧”。
  4. ready 列表中唯一的函数是$,因此它调用$。
  5. jQuery sees 它应该将 $ 函数作为参数传递给这些函数。
  6. 它以$ 作为参数调用$。
  7. $ 函数将函数视为其参数,但由于 DOM 已准备就绪,它直接调用该函数(无需等待)。
  8. $ 函数以$ 作为参数调用。
  9. 自从第 7 步适用后,一切都会再次发生。

【讨论】:

  • @LightnessRacesinOrbit - 是 - $(func) 是 $(document).ready(func) 的快捷方式。
  • 你会认为它正在做的所有安全检查,这将是我们微不足道的添加......
  • @LightnessRacesinOrbit - $() 是 $(document).ready() 的快捷方式。
  • 您的评论与您的​​原始答案略有不同:P
  • @Incognito:那是因为你不使用参数。试试$(function f($_again) { $_again(f); })。
【解决方案2】:

现在这就是我所说的“jQueryception”。

你在 jQuery 中调用整个 jQuery 库。

更多信息;

当您调用“$”(由 jQuery 库定义为 jQuery 核心函数)时,它会初始化 jQuery 并尝试调用已定义的函数(如果有的话)。当您实际调用“$($);”时你将在 jQuery 中调用 jQuery,它会一次又一次地调用 jQuery。

来自 jQuery 1.7.1 源代码;

    // HANDLE: $(function)
    // Shortcut for document ready
    } else if ( jQuery.isFunction( selector ) ) {
        return rootjQuery.ready( selector );
    }

和

rootjQuery = jQuery(document);

如你所见,当你调用 $($);它会尝试使用您的函数名称调用 jQuery,如果您再次使用 jQuery 调用它,同样的事情将无休止地发生,正如我之前解释的那样。

【讨论】:

  • @Diabolic - 你能再解释一下,这样这个答案就不会被删除吗?
  • 我将值得扩展这个答案只是一点点。
  • 有插件可以阻止这个吗?
【解决方案3】:

$ 是 jQuery 工厂函数的别名。

jQuery 工厂函数在将函数作为第一个参数传递时,会在 document.ready 处运行该函数,并将 jQuery 作为第一个参数传递给它。

因此,当到达document.ready 时,您会得到一个无限递归。

【讨论】:

  • 在文档加载后从控制台运行它是如何工作的(结果相同)?
  • @GGG 如果已经到达document.ready,jQuery 继续运行并在调用时运行赋予它的函数。
  • 我能够通过调用 $($); 使我的浏览器崩溃(至少挂起一段时间);来自 Firebug 控制台。
猜你喜欢
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
相关资源
最近更新 更多