【问题标题】:best way to call $(document).ready() function调用 $(document).ready() 函数的最佳方式
【发布时间】:2018-07-08 08:43:48
【问题描述】:

我想知道当 DOM 准备好时调用函数的最佳方式是什么。我的意思是,我知道

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

$(function(){})

是实现 DOM 的 action ready 的相同方式。 我的问题更多是关于性能,我通常这样写我的 JS:

$(document).ready(function(){
    console.log('Hello World');
});

但是一位老师曾经试图让我改变主意并这样写:

function main(){
    console.log('Hello World!');
}
$(document).ready(main);

事实是我从来没有这样做过,但现在我想知道在性能方面最好的方法是什么......如果我把所有东西都放在一个外部函数中,它加载速度会更快吗?

事实上,我写的是第一种方式,因为我不希望我的函数可以从 DOM 访问,所以我这样做了:

$(document).ready(function(){
    function Hello(){
            console.log('Hello World');
    }
    Hello();
});

这样,就无法从 DOM 或控制台使用 Hello 函数了……所以我不喜欢老师的方式。 但现在我习惯将我所有的代码封装在一个匿名函数中,这样我更容易写成这样:

(function($){
    function Hello(){
        console.log('Hello World!');
    }
    $(document).ready(Hello);
})(jQuery);

这就是为什么我想知道这两种方法之间的性能,你们怎么看?

【问题讨论】:

  • 其中任何一个的性能差异为零。我个人更喜欢$(function() { /* code here... */ });,因为它节省了几个字节。另请注意,您的 IIFE 可以被删除,因为 document.ready 处理程序接受 jQuery 对象作为它的第一个参数,即。 jQuery(function($) { /* code here... */ });
  • 唯一的区别可能是,另一方面,您有一个命名函数main 和一个closure,这可能会在内存中保存一个。否则,没有区别。更大的问题是,您几乎不需要ready states。大多数人总是会使用它们,但它们并不总是必需的。仅封装代码 IIFE 是更好的选择 ...
  • 除此之外,使用就绪状态而不知道它实际上做了什么can harm your page even more
  • 只需在

标签: javascript jquery performance dom ready


【解决方案1】:

TL;DR;

随心所欲!对您的网站没有这样的影响。

最好的方法是什么?

一般来说,你可以随心所欲,但有一些事实引导我们朝着正确的方向前进,这告诉我们,jQuery(function($) {}); 是一个相当不错的选择!

为什么?让我们看看...

事实 1:这是最短的方式。好的,IIFE 可能更短,但这不是真正的ready 状态,只是一个立即函数调用。

事实2: jQuery 自己编写就绪状态是首选的方式。从 v3 开始就提到要使用这种方式。

事实 3: 为什么要使用 IIFE 来传递 jQuery 对象?不需要,因为第一个函数参数是 jQuery 对象。

事实 4: 使用和不使用 jQuery noConflict 模式都很好。因为第一个参数是 jQuery 对象,所以您始终可以在就绪状态下使用$,而只需编写一次jQuery

事实 5:您不使用命名函数,只使用匿名闭包。在近 99.99% 的情况下,您只使用一次就绪状态处理程序。所以不需要命名函数或存储在变量中的函数。

所以在我看来,这是最好的选择:

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

【讨论】:

    【解决方案2】:

    我知道 ready 无法使用,但我有一些情况想使用它。让我告诉你 eisbehr ...... 想象一下,我们有一个计算窗口宽度和高度的函数,我想在就绪状态下调用它,但也在调整大小状态下调用它......所以如果我理解你的逻辑,我应该使用这个:

    jQuery(function($){
        var width;
        var height;
        function init(){
            width = $(window).width();
            height = $(window).height();
        }
        init();
        $(window).resize(init);
    });
    

    对吗?好吧,我想我会像现在一样继续下去:

    (function($){
        var width;
        var height;
        function init(){
            width = $(window).width();
            height = $(window).height();
        }
        $(document).ready(init); /* or $(init); */
        $(window).resize(init);
    })(jQuery);
    

    顺便说一句,感谢您的回答,您正确回答了这个问题:最好的方法是什么? 没关系随心所欲!对您的网站没有这样的影响。

    【讨论】:

    • 好吧,实际上我会这样做like this。 ;) 你的写作方式非常罕见。这在任何方面都没有错,但不是你经常看到的那样。唯一的问题是,像$(window).resize(init); 这样的东西也可以放在init 函数中。否则,它可能会出现与完全不使用就绪状态相同的问题。
    • 嗯我明白,老实说,我通常从不这样写我的脚本,我更舒服this way,但我理解你的逻辑,我想我喜欢复杂:P
    • 还有一点要记住:虽然 jQuery 的就绪状态是异步的,但 IIFE 不是。会直接执行,也就是说里面的每一个代码都是直接处理的!在您的示例中,它没有区别。但是如果那里有大的或阻塞的代码,bwoser 将停止,直到他完成 IIFE。如前所述,请记住...
    • @eisbehr 实际上这是我正在寻找的,我不知道 .ready 现在是异步的......所以我更喜欢 IIFE 方法。正如我对powerbuoy所说,如果您需要在html内容之前加载JS,最好使用IIFE,我以客户端验证为例,您不希望用户发送表单,因为您的验证脚本没有加载...但是还有很多其他情况
    • 如前所述,很高兴知道。如果你知道你在做什么,那没关系。就我个人而言,我不是你的意见,会留在 powerbuoy。你说的主要是毫秒,没有时间发布表格或其他东西。但是使用 IIFE,您会冒着步履蹒跚、加载延迟和滞后的风险,这对用户不利,并且会让您的页面看起来像编码错误。但这取决于你如何做事,如果你知道,你在做什么! ;)
    【解决方案3】:

    如果你想在另一个地方定义就绪函数,这真的取决于偏好,性能差异几乎不存在。我个人更喜欢

    $(document).ready(function(){
        //code for ready should be in here
    });
    

    因为我不需要在找到就绪后跳转到另一个函数。


    但最好的办法是尽可能使用原生 JavaScript,除非您支持超旧的浏览器。

    document.addEventListener("DOMContentLoaded", function(event) { 
      //do work
    });
    

    这和 ready 函数几乎一样,你不需要 jQuery,也比$(document).ready()快一点

    【讨论】:

    • 应该阅读文档,因为现在首选 jQuery v3 中的 $(function(){}),并且不推荐使用像您正在使用的其他签名
    • 而且readyDOMContentLoaded 不一样。他们有区别。也许不适合每个人,但至少不是相同
    • 我的错,我不再使用 jQuery,但我喜欢现成的,因为它的可读性,jQuery 1.6 也被大量使用,这是我工作很多的那个。
    • jQuery 1.6 是古老的,应该用作当前答案的参考
    猜你喜欢
    • 2017-08-03
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多