为什么$($)会导致我的页面崩溃?

28

免责声明:请勿在家中尝试此操作


为什么我在使用jQuery时,$($)会导致页面冻结?


3
美元是一个函数。如果你用美元调用自身,它会陷入无限递归。 - Demnogonis
3
为什么这个问题需要保护? - Jeremy
我应该称之为“jQueryCursion”或“jQueRecursive”! - Lloyd Dominic
3个回答

38

$($)$(document).ready($)的快捷方式。因此,它将在DOM准备就绪时运行该函数,或者当已经准备就绪时直接运行该函数。

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


另一个解释:

  1. 您调用$($)
  2. jQuery将函数参数($)添加到内部的ready列表中。
  3. 稍后,jQuery看到DOM已准备就绪,并认为:"让我们调用ready列表中的所有函数"。
  4. ready列表中唯一的函数是$,因此它调用$
  5. jQuery看到应该将$函数作为参数传递给这些函数。
  6. 它使用$作为参数调用$
  7. $函数将函数作为其参数,但由于DOM已准备就绪,它直接调用该函数(没有需要等待的内容)。
  8. $函数被使用$作为参数来调用。
  9. 由于步骤7适用于所有内容,因此一切都会再次发生。

9
@LightnessRacesinOrbit - 是的 - $(func)$(document).ready(func)的简写形式。 - pimvdb
1
你的评论和原始答案略有不同 :P - Xyan Ewing
1
@pimvdb:你之前没有加上($) ;) - Lightness Races in Orbit
1
@JAAulde: 没有特别的,你只是不必要地不精确。这个区别对于这个问题非常重要,因为我们正在分析一个对$的特定参数调用会做什么。当然,在这种情况下,它实际上是$(document).ready()的快捷方式,因为$是一个函数。 - Lightness Races in Orbit
2
@Incognito:那是因为你没有使用该参数。尝试 $(function f($_again) { $_again(f); }) - pimvdb
显示剩余8条评论

23

我称之为“jQueryception”。

你在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 - 你能再解释一下吗,这样答案就不会被删除了吗? - Naftali
1
我认为有必要稍微扩展一下这个答案。 - Kev
1
有没有插件可以停止这个? - iConnor

3

$jQuery工厂函数的别名。

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

因此,当达到document.ready时,就会开始无限递归。


当文档加载完成后,您如何在控制台中运行它并获得相同的结果? - Dagg Nabbit
如果 document.ready 已经被触发,jQuery 就会立即执行传递给它的函数。 - JAAulde
我可以通过在Firebug控制台中调用$($)来使我的浏览器崩溃(至少挂起一段时间)。 - Diabolic

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