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

时间:2012-03-06 14:42:58

标签: javascript jquery

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


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

3 个答案:

答案 0 :(得分:38)

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

为方便起见,传递给.ready的函数传递给jQuery函数(当你处于noConflict模式时尤其有用)。因此,$($)会以$作为参数调用$ - 所有内容都会再次发生,这是无休止的递归。


另一种解释:

  1. 您致电$($)
  2. jQuery将函数参数($)添加到内部ready列表中。
  3. 一段时间后,jQuery发现DOM已经准备好并且认为:“让我们调用ready列表中的所有函数”。
  4. ready列表中唯一的功能是$,因此它会调用$
  5. jQuery sees它应该将$函数作为参数传递给这些函数。
  6. 以[{1}}为参数调用$
  7. $函数将函数视为其参数,但由于DOM已准备就绪,因此它直接调用函数(没有什么可以等待的。)
  8. $为参数调用$函数。
  9. 因为第7步适用,所有事情都会再次发生。

答案 1 :(得分:23)

现在这就是我所谓的“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调用它,同样的事情将会无休止地发生,就像我之前解释过的那样。

答案 2 :(得分:3)

$jQuery工厂函数的别名。

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

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