javascript 中时间切片是如何发生的?

2024-06-28

或 ecmascript 但我想知道它实际上是如何发生的更多地取决于确切的实现。

javascript 从技术上讲是单线程的。

但如果我做类似的事情

$myDIv.animate({
    height:"100px"
});

如果我这样做有什么区别吗

A.

$myDIv.animate({
    height:"100px"
}, null, my_cpu_heavy_function);

or B.

$myDIv.animate({
    height:"100px"
});
my_cpu_heavy_function();

因为在第二个动画中,动画将与 cpu 繁重功能争夺处理时间,因此动画的外观会受到影响,对吗?

那么,Javascript 是在同步代码块结束时停止执行,还是在任意随机点切断一个块以允许处理另一个异步运行的块?


JavaScript 中没有时间切片。 Javascript 是单线程的(除了我们在这里不讨论的网络工作者)。 JavaScript 执行的一个线程会一直运行直至完成。

在您的第一个代码示例中,动画执行其操作,当它完全完成时,它会调用您的my_cpu_heavy_function.

在第二个代码示例中,动画初始化自身并为其第一个动画步骤设置计时器。然后它返回并进入下一行代码。动画才刚刚开始(并设置一个计时器,以便在将来做一些更多的工作)——它还没有完成。那么,你的my_cpu_heavy_function运行并占用整个 javascript 执行直到完成。动画根本不运行my_cpu_heavy_function在跑。完成后,动画设置的计时器事件将触发,动画将开始运行。

动画可能“看起来”像时间切片,但事实并非如此。 jQuery 动画在动画中移动一步,然后在未来的一小段时间内设置一个计时器,然后它们返回到系统。当计时器事件触发时,jQuery 会执行动画的下一步,依此类推。当计时器事件触发时,它会将计时器事件放入 JavaScript 事件队列中。如果当前没有运行 javascript,则立即启动计时器回调。如果 javascript 当前正在运行,则计时器事件只会位于事件队列中,直到当前 javascript 线程完成。当该线程完成时,JavaScript 会在事件队列中查找是否有任何事件在等待。如果有,则调用事件回调。

因此,确实没有时间针对不同的 JavaScript 片段进行划分。想要运行的两段代码不会像本机代码中的真实线程那样,分别获得一些 CPU 周期。在 javascript 中,一段代码会一直运行直到完成,然后才能开始下一个事件。在基于 JavaScript 的动画之类的事情中,可以通过执行少量工作,然后为未来的某个时间设置计时器并返回到系统来模拟时间切片。一旦你完成执行,其他一些 JavaScript 片段就可以运行,但它也会运行直到完成。如果所有的 javascript 只做少量的工作,然后为下一个工作设置一个计时器,那么它们都可以合作,看起来就像有时间切片,但只有它们之间的合作才有效。如果一个函数像my_cpu_heavy_function出现并占用 CPU 一段时间,在此期间没有其他人运行。动画将停止my_cpu_heavy_function正在跑步。

浏览器中的一些操作是由浏览器中的本机代码执行的(例如ajax调用、图像加载等)。这些异步任务可以在 javascript 运行时在后台进行,但它们不会通知 javascript,直到当前 javascript 执行线程完成并且可以启动具有通知回调的新线程。

举个例子,假设我们有一个需要 1 秒加载的图像和一个需要 5 秒运行的 CPU 密集型函数。然后我们有这样的代码:

var img = new Image();
img.onload = function() {
    alert("image is loaded now");
}
img.src = "xxx.jpg";
longFunctionThatTakesFiveSecondsToRun();

当我们运行这段代码时,即使图像在浏览器内部加载只需要 1 秒,onload 处理程序也不会被调用,直到longFunctionThatTakesFiveSecondsToRun()5秒后运行完毕。它必须等到当前执行线程完成后才能处理 onload 事件。

如果您想了解有关 javascript 事件队列和异步操作的更多信息,请参阅以下相关答案:

JavaScript 如何在后台处理 AJAX 响应? https://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649

JavaScript 事件处理的竞争条件? https://stackoverflow.com/questions/8611145/race-conditions-with-javascript-event-handling/8611469#8611469

JS 事件处理程序可以中断另一个处理程序的执行吗? https://stackoverflow.com/questions/8016001/can-js-event-handlers-interrupt-execution-of-another-handler/8016185#8016185

我是否需要关心异步 Javascript 的竞争条件? https://stackoverflow.com/questions/7238586/do-i-need-to-be-concerned-with-race-conditions-with-asynchronous-javascript/7238663#7238663

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

javascript 中时间切片是如何发生的? 的相关文章

  • Tampermonkey 的 GM_xmlhttpRequest 未实现“上下文”属性?

    我已经为 Greasemonkey Firefox 编写了一个用户脚本 并正在测试它与 Chrome 的 Tampermonkey 的兼容性 并在开发人员控制台中收到错误 Uncaught TypeError Cannot read pro
  • 如何使用 angular2 在客户端生成 rsa 密钥对?

    我需要知道如何使用 angular2 在客户端生成 rsa 密钥对 我需要生成私钥 公钥对并将私钥保存到数据库中 并希望在客户端内使用公钥 我怎样才能实现这个 我找到了这个https www npmjs com package genera
  • HTML5 Canvas - 在画布上绘图、保存上下文并稍后恢复

    要求 现在 在画布上绘制 然后点击 保存 存储画布状态 离线绘制 但不作为图像 稍后 打开画布并显示之前保存的绘图 然后继续再次绘制 对于绘图 我们通常使用如下代码 canvas document getElementById can ct
  • 使用 JavaScript 查找数组中最接近的日期

    我有一个包含天数的数组 每一天都是一个对象 例如 day year 2012 day month 08 day number 03 day name mon 我还通过使用以下方法向每个日期对象添加了时间戳属性 function conver
  • 如果用户禁用了 javascript,如何回退到完全不同的索引页面?

    我有一个大型 动态生成的单页网站 该网站严重依赖 javascript 我想为没有 javascript 的人提供后备 每个版本必须有不同的 php 代码 所以基本上我需要一个完全不同的索引页面 我不想将所有内容都包装在 javascrip
  • 错误:捆绑失败:TypeError:无法读取未定义的属性“transformFile”,React Native

    每当我运行react native start时 我都会收到此错误 但是最近在我在节点模块中安装了firebase tools和stripe之后 这种情况开始发生 但在此之前它会运行得很好 这也是错误的堆栈跟踪 ffff 127 0 0 1
  • 如何让机器人状态显示为“手机在线”

    我看到 NotSoBot 的状态为在线在移动 https i stack imgur com IiF4k png 有没有办法可以在discord js 中做到这一点 我知道这已经很旧了 但更简单的方法是将其添加到定义客户端 机器人的位置 c
  • 闭包和异步 Node.js 函数

    All 尝试了解 Node js 上下文中的闭包 异步调用 我有以下代码 timer setInterval pollOID 1000 function pollOID for channel in channels session get
  • 在浏览器开发工具中看不到SignalR流量

    我构建了使用 SignalR 的服务器和客户端代码 该网站运行完美 但我无法在任何浏览器 chrome IE Firefox 中看到网络流量 我知道网络流量在那里 因为该网站正在运行 有没有办法在浏览器中查看 SignalR 流量 如果不是
  • Firebase 停止监听 onAuthStateChanged

    从版本 3 0 0 开始 我很难删除身份验证状态更改侦听器 要根据文档启动侦听器 firebase auth onAuthStateChanged function user handle it 但是 我在文档中找不到任何涉及删除身份验证状
  • 将变量从一个 jsp 发送到另一个 jsp

    我有一个 JSP 文件jsp 1 jsp和另一个 JSP 文件jsp 2 jsp 我已经包括了jsp 2 jsp in jsp 1 jsp using 现在我需要某个元素上的单击事件 在该事件中 我想将字符串变量传输到包含的 jsp 中 假
  • up() 和 down() 与 Ext.getCmp()

    我很困惑我需要在 up down 和 Ext getCmp ID 之间使用哪一个作为 grep 对象 对我来说 定义对象的 ID 并通过 Ext getCmp ID 检索对象更容易 而且代码看起来更干净 例如 console log thi
  • Netlify 正在显示我的 Gatsby 网站的 html 版本

    网站建设位于https 5efbc255ca51be00080b5219 epic raman 086510 netlify app https 5efbc255ca51be00080b5219 epic raman 086510 netl
  • 带搜索框的 D3 图表

    我在 D3 中创建了一个图表 其中节点显示特定个人创建文档的时间 该图表还显示了一个搜索框 该搜索框根据搜索框输入是否与与该文档关联的单词匹配而将节点变成红色 这些单词列在数据集的第 5 列中 请参阅下面的数据集 我的问题 一旦将搜索输入到
  • 使用预先存在的数据库创建 PhoneGap iOS 应用程序

    我最近开始开发一个使用 PhoneGap 版本 2 8 0 作为药物查找器的应用程序 过去 我创建了该工具的 Web 版本 它使用 jQuery Mobile 和 PHP 来访问远程 SQL 数据库 PhoneGap 似乎是一个很有吸引力的
  • ag-Grid 中的行格式

    我们需要有条件地将行文本设置为粗体 目前它仅适用于单个单元格 但我们需要在所有列单元格上应用文本粗体 应用格式设置后 isBold 列必须隐藏 删除 此列仅用于格式化 如何应用文本缩进 10px isBold 列包含真实值的第一列的 有可能
  • Javascript 或 Coffeescript 中的“Bucket Fill”算法

    我正在编写一个小coffeescript js应用程序 允许用户设计图标 16x16像素或32X32像素 该图标实际上是一个带有颜色单元的二维数组 单元格可以有颜色或为空 我希望用户能够使用 桶油漆 工具填充空白单元格 代表着 如果用户单击
  • 删除移动设备上的 adsense

    我正在研究响应式设计 但在使用 adsense 时遇到了问题 我有一个广告应该显示在桌面设计上 但不能显示在移动设计上 因此 只有在桌面上查看网站时 才应将广告代码放置在 html 中 css 可以使用 display none 但这违反了
  • 当 JavaScript 抛出异常时不要停止它

    我正在使用 JavaScript 编写一个 Windows 边栏小工具 现在我想捕获所有 JavaScript 异常并将其记录到文本文件中 一个问题是 当任何一行抛出异常时 下一行将不会被执行 是否可以自动捕获异常 以便执行以下 JavaS
  • React Native:当您的应用程序关闭时是否有回调函数?

    我有一个 setInterval 即使您关闭 而不是退出 应用程序也会继续运行 我想在我的应用程序关闭或设备进入睡眠状态时调用一个函数 以便清除 setInterval AppState 是你的朋友 看看AppState 的文档 https

随机推荐