javascript - JS 脚本未按顺序下载和评估

标签 javascript html http

我有 3 <script>标记为 <body> 中的最后一个元素.他们加载外部 .js 脚本:

    ...
  </div>
  <script src="https://somewhere.com/scripts/script1.js"></script>
  <script src="https://somewhere.com/scripts/script2.js"></script>
  <script src="https://somewhere.com/scripts/script3.js"></script>
</body>
</html>
所有脚本仅包含一行:console.log(Start script X) ,其中 X 是脚本编号。
我期待脚本按顺序进行评估,输出为:
Start script 1
Start script 2
Start script 3
但输出似乎是随机的。更准确地说,评估顺序似乎完全取决于脚本完成下载的顺序。
我期望评估顺序模仿它们在 HTML 中引用的顺序是否正确?
如果不是,我如何确保以正确的顺序评估它们(除了将它们全部合并到一个 .js 文件中)?

最佳答案

你的观察是正确的。我理解您的期望,但是这种评估顺序意味着文件是按顺序而不是并行下载的,或者它们是按顺序而不是并行进行评估的。
渲染它们以按顺序下载或执行会很麻烦。如果脚本从不下载怎么办?后续脚本是否应该永远挂起?这将比现在的情况更糟糕。
如果脚本不相互依赖怎么办?即使没有意义,他们是否应该互相等待?当然不是。
所以实际的行为是正确的,但你是对的,这也意味着一些问题。
一般来说,这个问题的解决方案是将脚本分解成可以在理想时执行的类和函数,而不是在脚本下载时也有一个onloadbody 中的事件标签或 load event通过 AddEventListener 创建.
假设有一个 f1 function在 script1 中,f2 function在脚本 2 中,...
然后你可以做这样的事情:

window.addEventListener('load', (event) => {
  f1();
  f2();
  //...
});
你甚至可以这样做:
function load() {
    f1();
    f2();
    //...
}
然后将其添加到 body :
<body onload="load()">
    <!-- ... -->
</body>

关于javascript - JS 脚本未按顺序下载和评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67786531/

相关文章:

javascript - 显示多个幻灯片的 HTML 页面

http - 为什么 TLS 允许将证书颁发给不同的子域?

http - 通用 TCP、UDP、HTTP 反向代理设置

javascript - 未找到 Slack web-api 返回 channel chat.postMessage 到私有(private) channel

javascript - Chrome通过代码检查元素内容

javascript - SharePoint - 带有用户名和密码的 URL 链接

javascript - 为什么 React/Redux 会重置所有事件处理程序,即使 `state` 没有改变

javascript - 动态添加标签,点击按钮

javascript - 为什么按钮不触发第二个功能?

unit-testing - Resteasy,使用 RestEasy 的服务器端模拟框架制作 Http-Put 或 Http-Post