首页 > 解决方案 > 对这段代码中异步如何发生感到困惑

问题描述

我是 JS 新手,正在学习回调以及回调如何发生异步。我在https://javascript.info/callbacks上遇到了代码,它是

function loadScript(src) {
  let script = document.createElement('script');
  script.src = src;
  document.head.append(script);
}

loadScript('/my/script.js');
// the code below loadScript doesn't wait for the script loading to finish
// ...

所以,据说 loadScript 函数是异步执行的,但为什么呢?据我所知,异步发生在通过事件循环执行的 setTimeOut 或 xhr 对象等函数上。那么,为什么我们只在 loadScript 函数中创建元素,它是异步执行的

标签: javascript

解决方案


文章中的措辞写得不好。

该函数被称为“异步”,因为动作(脚本加载)不是现在完成,而是稍后完成。

函数调用是同步的。的加载/my/script.js是异步的,因为 JS 在继续调用堆栈之前不会等待文件加载完毕。使用创建的任何script元素createElement都是异步加载的-您可以在此处阅读有关它的更多信息:

动态插入的脚本(使用document.createElement())默认异步加载

下面是一个更好的异步调用示例:

let script = document.createElement('script');

script.src = '/my/script.js';
document.head.append(script);

script.onload = function()
{
  // Any code defined inside here is now truly asynchronous.
  // It will not be called until /my/script.js has been loaded.
}

推荐阅读