为什么我要在jQuery(function ($) { });中封装一个jQuery函数



我遇到了一段代码,看起来像这样:

jQuery(function($) {
  $('#saySomething').click(function() {
    alert('something');
  });
});

我不太明白。为什么我不能简单地这样做:

$('#saySomething').click(function() {
   alert('saySomething');
});
jQuery(function ($) {...});

是以下各项的简写版本:

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

如果不等待document准备就绪,则绑定事件的元素将不会存在于 dom 中,并且事件实际上不会被绑定。

或者,您可以等待body完成加载,但这将包括等待图像,这需要更长的时间来加载。

说实话,你不必等待document.ready.如果您知道元素存在于 DOM 中,您可以继续使用 $('#saySomething').click(...)

<button id="saySomething>Say Something!</button>
<script>
    jQuery('#saySomething').click(...);
</script>

您应该了解最后一个细微差别jQuery(function ($) {...});。函数中的 $ 参数用于别名jQuery $ ,这将允许您在函数中使用 $ 速记,而不必担心与其他库(例如原型)的冲突。

如果你不等待document.ready通常会看到一个用于别名jQuery的IIFE:

(function ($) {
    $('#saySomething').click(...);
}(jQuery));
jQuery(function($) {

是 的快捷方式

jQuery(document).ready(function(){

这将等到文档处于构建 DOM 的"就绪"状态。 然后,jQuery脚本可以使用完整的页面,而不会错过任何元素。

但是 - 你可以在没有它的情况下运行 jQuery。 如果脚本位于头部,则冒着选择尚未创建的元素的风险。 我已经在我的文档正文中使用了jQuery,紧跟在我想要影响的元素之后,以尝试尽快对它们进行操作。 这是一个不寻常的情况,我通常不会这样做。

使用 ready 函数的另一个原因 - 您可以多次运行它。 如果包含多个脚本或有条件包含的代码,则可以具有多个 ready() 函数。 每个就绪块中的代码将一直保留到达到就绪状态,然后按添加顺序执行代码。

第一个示例在页面完全加载后被执行。第二个示例直接执行(并且可能会失败)。

因此,第一个是以下的简写:

$(document).ready(function(){
  // Do something after the page is loaded.
});

这是"文档加载"的简写,他们也使用了带有 $ 别名的手写"jQuery",以避免与使用 $ 符号的其他库发生冲突。

如果您不等待文档加载,事情可能会变得不可预测/无法正常工作。此外,如果您有命名冲突,事情就会

变得简单。

$(function() {})是jQuerys文档就绪函数 http://api.jquery.com/jQuery/#jQuery3 的缩写,http://api.jquery.com/ready/了解更多信息<</p>

div class="one_answers">

直接从文档中复制和粘贴:

jQuery( callback )回报:jQuery

描述:绑定要在 DOM 完成时执行的函数 装载。

version added: 1.0jQuery( callback )
`callback` The function to execute when the DOM is ready.

这个函数的行为就像$(document).ready(),因为它应该 用于包装页面上的其他$()操作,这些操作依赖于 DOM 已准备就绪。虽然从技术上讲,此功能是可链接的,但存在 真的没有多大用处来拴住它。

请查看 API

这取决于代码的上下文,但在 JavaScript 中有一个常见的设计实践,将变量和方法封装在命名空间或模块模式中。此代码可能是该意图的派生。

模块设计模式背后的原因归结为全局变量的复杂性和"破坏"的危险。

当定义两次同名的任何变量(或函数)时,可能会发生重叠。第二个定义将覆盖第一个定义,实质上是破坏它。

因此,将代码包装在将变量(和函数)与全局命名空间隔离开来的构造中是一种经验法则。道格拉斯·克罗克福德(Douglas Crockford)很好地描述了这些类型的场景。

这个例子展示了一个稍微更常见的化身,称为"闭包":

var jspy = (function() {
    var _count = 0;
    return {
      incrementCount: function() {
        _count++;
      },
      getCount: function() {
        return _count;
      }
    };
})();

起初它令人迷失方向,但一旦你认识到它,它就会成为第二天性。关键是将_count变量封装为返回对象的私有成员,该对象具有两个可访问的方法。

这很强大,因为全局命名空间现在只包含一个 var (jspy),而不是一个具有两个方法的命名空间。它强大的第二个原因是它保证_count变量只能通过两种方法(incrementCount,getCount)中的逻辑访问。

正如我所说,你的代码可能是这个经验法则的化身。

无论哪种方式,在 JavaScript 中了解这种模式都很重要,因为它为框架之间更强大的交互打开了大门,例如在 AMD 中异步加载它们。

这是一个不错的命名空间示例。

总而言之,有一个高级的JavaScript设计模式可以帮助您了解,相关的术语是模块模式,命名空间模式。其他相关术语包括闭合和 AMD。

希望有帮助。万事如意!Nash

这个jQuery(function(){...}jQuery(document).ready(function(){...})的shorcut。当 DOM 准备就绪时,会触发 Ready 事件,因此您可以确保未访问尚不可用的内容。

另一方面,如果您像在第二个代码段上一样绑定点击方法。该代码将立即执行,因此您需要确保将其放在声明#saySomething之后。

jQuery(function($) { ... });阻止代码执行,直到 DOM (HTML) 完全呈现和访问。

如果你的jquery不需要完全加载DOM,你可以安全地使用任何一种形式。为了保证 DOM 在执行 jquery 之前完全加载,请将 jquery 语句包装在 $(function... 中。

$(function(){ ...});$(document).ready(function(){ ... });的快捷方式https://stackoverflow.com/a/6454695/209942http://jqfundamentals.com/chapter/jquery-basics

包装在 $(function 中的 Jquery 代码不会执行,直到所有 HTML 都完全解析到内存中并且文档准备好与之交互。

如果在您的环境中,不能保证在渲染器命中您的 jquery 之前完全加载 DOM,那么您必须将 jquery 包装在 $(function 中。

你也可以尝试这个替代的 DOM 就绪形式,它使 $ 成为局部变量,以避免与其他可能使用 $ 符号的变量发生冲突:

jQuery(function($){...}); https://stackoverflow.com/a/6454701/209942

如果jquery代码没有包装在$(function中,它会起作用吗?如果您的 DOM 已加载,那么是的。DOM 加载取决于你如何加载 JavaScript。
当在 HTML 正文末尾引用外部 JavaScript 文件时,如何调用 JavaScript 函数?

请注意,这个其他类似的形式不会等待 DOM 呈现。它是一个立即执行的函数文字。它没有前导 $ 或前导 jquery,但有尾随的 open+close 参数:

function(){...})();

最新更新