无延迟调用setTimeout

2024-03-15

在 JavaScript 库中经常看到这样的代码:

setTimeout(function() {
    ...
}, 0);

我想知道为什么要使用这样的包装代码。


非常简化:

浏览器是单线程的,并且这个单线程(UI 线程)在渲染引擎和 js 引擎之间共享。

如果您想做的事情需要花费大量时间(我们在这里讨论循环,但仍然如此),它可能会停止(暂停)渲染(流程和绘制)。

在浏览器中,还存在“存储桶”,所有事件首先都会等待 UI 线程完成其正在执行的操作。一旦线程完成,它就会在桶中查找并选择队列中第一个任务。

Using setTimeout您在延迟后在存储桶中创建一个新任务,并让线程在可用于更多工作时立即处理它。

A story:

0 毫秒延迟后创建函数的新任务 并将其放入桶中。就在那一刻,UI 线程正忙 正在做其他事情,并且桶中还有其他任务 已经。 6ms 后线程可用并获取前面的任务 你的,很好,下一个就是你了。但什么?那是一件大事!它有 就像永远(30毫秒)!

最后,现在线程已经完成了,并得到了你的 任务。

大多数浏览器的最小延迟都大于 0,因此将 0 作为延迟意味着:尽快将此任务放入购物篮。但是告诉 UA 尽快将其放入桶中并不能保证它会在那一刻执行。桶就像邮局,可能还有其他任务排着长队。邮局也是单线程的,只有一个人帮助完成所有任务……对不起客户的任务。你的任务必须和其他人一样排队。

如果浏览器没有实现自己的代码,它将使用操作系统的时钟周期。较旧的浏览器的最小延迟在 10-15 毫秒之间。 HTML5指定 http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timers如果延迟小于 4ms,UA 应将其增加到 4ms。据说这是2010 年及以后发布的浏览器之间保持一致 https://developer.mozilla.org/en/DOM/window.setTimeout#Minimum_delay_and_timeout_nesting.

See JavaScript 定时器如何工作 http://ejohn.org/blog/how-javascript-timers-work/约翰·雷西格 (John Resig) 撰写,了解更多详细信息。

Edit:另请参阅事件循环到底是什么? https://www.youtube.com/watch?v=8aGhZQkoFbQ作者:Philip Roberts,来自 JSConf EU 2014。这是所有接触前端代码的人都必须查看的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无延迟调用setTimeout 的相关文章

随机推荐

  • 如何在 Interface Builder 中使用 UIScrollView?

    虽然我用过UIScrollView过去通过以编程方式成功地操作它 我很难通过在 Interface Builder 中专门设置它来使其工作 我的 iPhone 应用程序中有一个简单的 关于 页面 它有一个UITextView 一些图标以及指
  • 如何将光标置于文本区域的开头

    我找到了一些关于如何将光标放在文本末尾的文本区域中的资源 但我无法找到一种简单的方法来使其出现在开头 我正在用一些文本预先填充文本区域 只是想让用户更容易 将对文本区域的引用传递给此 JS 函数 function resetCursor t
  • 带 @JsonIgnore 的属性和不带注释的属性有什么区别?

    考虑下面的类 private static class Widget JsonProperty private String id ID JsonIgnore private String jsonIgnored JSON IGNORED
  • 使用 MinGW 在 Windows 上编译小型 Gcc 项目

    所以我用 C 编程已经快两年了 一直以来我很高兴使用具有可爱的项目设置和自动链接等功能的 IDE VS 我总是远离任何需要我通过 makefile 进行编译的外部库 或者至少是那些适用于 Linux 环境 其他编译器的库 无论如何 我现在想
  • document.getElementById 方法在哪里定义?

    注 本文仅用于学习目的 console log this document getElementById function alert testing document getElementById someID 我写了上面一段javasc
  • 设计注册确认

    我的项目中有一个用户和一个管理员角色 我使用 Devise 创建了身份验证 在我的管理员角色中 我没有任何确认 在我的用户模型中 我有以下内容 devise database authenticatable confirmable reco
  • Julia 转置 DataFrame 中的分组数据?

    ds Dataset group repeat 1 3 inner 2 b repeat 1 2 inner 3 c repeat 1 1 inner 6 d repeat 1 6 inner 1 e string a f 在inmemor
  • java.io.IOException:没有这样的文件或目录(保存图像)

    我将从设备中选择的照片上传到 ftp 但是 尽管我从设备中选择了照片 但我收到 没有这样的文件目录 错误 虽然我授予应用程序权限 但它不会将其保存到我在应用程序中选择的 IMAGE DIRECTORY 中 所以我收到这个错误 尽管我授予了权
  • CSS 悬停有时不适用于 svg 路径

    我有一个带有路径的 svg 并且我将 css 悬停在它们上面 但悬停有时有效 有时无效 可能是什么问题 div div
  • .Net中的优先级队列[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找优先级队列或堆数据结构的 NET 实现 优先级队列是比简单排序提供更多灵活性的数据结构 因为
  • 原始指针参数的shared_ptr

    当函数需要char 时 可以传入shared ptr吗 我正在读取整个文本文件 长度 100 并且想要将字符存储到 char 数组中 我使用的天真的方法是这样的 ifstream dictFile fileName size t fileL
  • 如何使用子字符串删除字符串(文件名)的结尾?

    我知道我必须使用 Substring 来删除 但我不知道该怎么做 我需要像这样删除字符串末尾 from C Users myname Pictures shoeImage jpg to C Users myname Pictures 使用以
  • 在Python源代码中使用UTF-8编码[重复]

    这个问题在这里已经有答案了 考虑 cat bla py u unicode d s u encode utf 8 print s python bla py File bla py line 1 SyntaxError Non ASCII
  • WM_GETICON 有时不返回图标句柄

    我试图显示所有窗口标题 包括相应的图标 就像 Windows 任务管理器那样 但这仅在一定程度上有效 尽管我能够获取窗口的标题栏文本 但该图标并不总是可用 为了获得图标 我通过了WM GETICON发消息给SendMessage sourc
  • PIL 图像从 RGB 转换为 YCbCr 结果为 4 个通道而不是 3 个通道,并且行为类似于 RGB

    嗯 标题很不言自明 我有一个图像文件 我想将其分别分成 Y Cb 和 Cr 打开文件后 将其从 RGB 这是打开图像文件时的默认模式 转换为 YCbCr 然后使用 numpy array 将其转换为数组 结果是一个具有 4 个通道的 2D
  • 重定向到 root_url 并返回,除非 @user.activated

    这是我的users controller方法 如果用户未激活 则应重定向 def show user User find params id redirect to root url and return unless user activ
  • android 使用 MapView 滑动水平视图分页

    我有一个 Android 应用程序 其视图包含 3 个页面 用户可以通过滑动手指 向左或向右 水平视图分页 在这些页面之间进行导航 我下载了 android support v4 view ViewPager 并找到了实现滑动部分的方法 这
  • 从两个不同的 C DLL 调用两个同名函数

    我需要在同一个可执行文件中访问两个 C DLL 我有两个库的头文件和 LIB 文件 不幸的是 我需要访问的函数子集具有完全相同的名称 到目前为止 我能想到的最佳解决方案是使用 LoadLibrary 加载其中一个 DLL 并使用 GetPr
  • 如何在 WordPress 中动态创建 pdf? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我使用 Contact Form 7 让用户输入数据 然后根据他们的数据输入 我需要在输出整个 pdf 之前向 pdf 添加不同的文本
  • 无延迟调用setTimeout

    在 JavaScript 库中经常看到这样的代码 setTimeout function 0 我想知道为什么要使用这样的包装代码 非常简化 浏览器是单线程的 并且这个单线程 UI 线程 在渲染引擎和 js 引擎之间共享 如果您想做的事情需要