You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript ES6如何在加载外部脚本后执行函数?求可靠替代方案

基于ES6+的原生替代方案:加载外部脚本并执行回调

当然有!完全不需要依赖jQuery,ES6+本身就提供了多种可靠、优雅的方式来实现这个需求。下面是几个常用的方案,覆盖不同场景:

方案1:用Promise封装原生脚本加载(兼容性最佳)

这个方案兼容性好,支持几乎所有现代浏览器,而且可以灵活复用,还能完善处理加载错误:

function loadScript(url) {
  return new Promise((resolve, reject) => {
    const script = document.createElement('script');
    script.src = url;
    // 脚本加载完成后触发resolve
    script.onload = () => resolve();
    // 加载失败时触发reject,带上错误信息
    script.onerror = () => reject(new Error(`无法加载脚本: ${url}`));
    // 将脚本插入到页面头部
    document.head.appendChild(script);
  });
}

// 使用示例
loadScript('foo.js')
  .then(() => {
    // 脚本就绪,调用里面的方法
    runFunction();
  })
  .catch(error => {
    // 捕获加载失败的情况
    console.error(error);
  });

如果需要同时加载多个脚本,可以结合Promise.all来实现:

Promise.all([
  loadScript('foo.js'),
  loadScript('utils.js')
])
.then(() => {
  // 所有脚本都加载完成后执行
  runFunction();
  initUtils();
})
.catch(error => {
  console.error('某个脚本加载失败:', error);
});

方案2:使用ES动态import()(现代浏览器首选)

如果你的项目支持ES模块,或者目标浏览器是现代版本,那么动态import()是最简洁的方案——它是ES6+的原生特性,专门用于异步加载模块:

import('foo.js')
  .then(module => {
    // 如果脚本是ES模块,直接调用导出的方法
    module.runFunction();
    // 如果脚本是全局挂载的方法,直接调用即可
    runFunction();
  })
  .catch(error => {
    console.error('脚本加载失败:', error);
  });

这个方案的优势在于语法极简,原生支持模块依赖管理,不需要手动创建script标签。需要注意的是,动态import()需要浏览器支持ES模块(大部分现代浏览器都支持),如果要兼容旧浏览器,可以通过Webpack、Rollup等打包工具处理。

和jQuery方案的对比

这些原生方案相比$.getScript有几个明显优势:

  • 不需要引入jQuery,减少项目体积
  • 拥有更完善的错误处理机制(catch可以捕获加载失败的情况)
  • 更灵活,可以扩展出批量加载、顺序加载等复杂逻辑
  • 符合现代JavaScript的编程范式(Promise/ES模块)

内容的提问来源于stack exchange,提问作者Skyzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:21:29