【发布时间】:2013-01-27 08:17:56
【问题描述】:
免责声明:请勿在家尝试
如果我使用 jQuery,为什么$($) 会冻结页面?
【问题讨论】:
-
美元是一个函数。如果你自己调用它,它会陷入无限递归。
-
为什么这个问题需要保护?
-
我应该称它为“jQueryCursion”或“jQueRecursive”!
标签: javascript jquery
免责声明:请勿在家尝试
如果我使用 jQuery,为什么$($) 会冻结页面?
【问题讨论】:
标签: javascript jquery
$($) 是$(document).ready($) 的快捷方式。因此,它将运行该函数(当 DOM 准备好时或直接在这种情况下运行)。
为方便起见,传递给.ready 的函数被传递给jQuery 函数(在noConflict 模式下特别有用)。因此,$($) 将调用 $ 并以 $ 作为参数 - 一切都会再次发生,这是无休止的递归。
另一种解释:
$($)。$) 添加到内部 ready 列表中。ready 列表中的所有函数吧”。ready 列表中唯一的函数是$,因此它调用$。$ 函数作为参数传递给这些函数。$ 作为参数调用$。$ 函数将函数视为其参数,但由于 DOM 已准备就绪,它直接调用该函数(无需等待)。$ 函数以$ 作为参数调用。【讨论】:
$(func) 是 $(document).ready(func) 的快捷方式。
$() 是 $(document).ready() 的快捷方式。
$(function f($_again) { $_again(f); })。
现在这就是我所说的“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 调用它,同样的事情将无休止地发生,正如我之前解释的那样。
【讨论】:
$ 是 jQuery 工厂函数的别名。
jQuery 工厂函数在将函数作为第一个参数传递时,会在 document.ready 处运行该函数,并将 jQuery 作为第一个参数传递给它。
因此,当到达document.ready 时,您会得到一个无限递归。
【讨论】:
document.ready,jQuery 继续运行并在调用时运行赋予它的函数。