jQuery 语法之间的差异

Difference Between jQuery Syntax

我只是想知道这两者有什么区别? 有时,只有第二个版本有效:

(function ($) { ... })(jQuery);

jQuery(function ($) { .... });

区别很大:

  1. 第一个是立即调用的函数表达式(IIFE):一旦遇到函数,函数的内容就是运行。

  2. 第二个注册一个 jQuery "ready" 回调。在 jQuery 确定 DOM 为 "ready" 之前,不会调用函数的内容。这是 ready 的 shorthand。

在这两种情况下,jQuery 符号的值作为 $ 参数传递给函数,因此您可以在 jQuery 中使用 $即使使用了 noConflict 功能。 (在第一种情况下,它是在 IIFE 中明确完成的;在第二种情况下,jQuery 在调用回调时执行。)

有时第二个会 "work" 而第一个不会的原因是函数的内容在 DOM 中查找元素,而在第一种情况下可能不是那里。考虑:

<script>
(function($) {
  $("#foo").on("click", /*...*/); // Doesn't find the element
})(jQuery);
</script>
<div id="foo">...</div>

当函数 运行s 时,#foo 元素还不存在,点击处理程序将不会被附加。但是,如果您改用 ready 版本,jQuery 将等待 运行 函数的内容,直到稍后。

如果您控制 script 标签的位置,则不需要 ready;相反,只需将 script 标记放在文档的末尾,就在结束 </body> 标记之前,这样当代码 运行 时,代码可能要使用的所有元素都已经存在s,例如:

<div id="foo">...</div>
<!-- ... -->
<script>
(function($) {
  $("#foo").on("click", /*...*/); // DOES find the element
})(jQuery);
</script>
</body>
(function ($) { ... })(jQuery);

这是一个自调用函数,您将 jQuery 作为参数传入。

jQuery(function ($) { .... });

这是 jQuery 的 document.ready 处理程序的快捷方式。

两者之间的主要区别在于第一个示例中的代码将立即为 运行,而当 DOM 为准备好。因此,如果您在第一个块中的代码依赖于 DOM 中某些元素的存在,它将失败。