ECMAScript定义JavaScript语言核心(语法、类型、内置对象),Web API由宿主环境提供(如浏览器的fetch、DOM);两者分离,ES保证跨环境语法一致性,Web API实现环境特有功能。

JavaScript 语言本身由 ECMAScript 标准 定义,它规定了语法、类型、内置对象(如 Array、Promise、Map)等核心能力;而你在浏览器中能调用的 fetch、document.querySelector、setTimeout 等功能,不属于 ECMAScript,它们来自浏览器提供的 Web API —— 这是宿主环境(如浏览器或 Node.js)额外注入的能力。
ECMAScript 是 JavaScript 的“内核”
ECMAScript(简称 ES)只管语言本身的规则:变量作用域、this 绑定、async/await 语义、Symbol 类型怎么用、Object.keys 返回什么……它不关心你有没有网络、有没有屏幕、能不能读文件。ES 规范不包含任何 I/O 相关接口,也不定义 DOM 或事件模型。
不同宿主环境只要实现同一版 ES(比如 ES2022),就能保证代码在语法和基础行为上一致。这也是为什么同一段 JS 能在 Chrome、Firefox、Node.js 中正确运行——只要它们都遵循相同的 ES 版本。
Web API 是浏览器给 JavaScript 的“扩展工具箱”
Web API 是浏览器厂商(主要是 WHATWG 和 W3C)制定的一套接口规范,包括:
立即学习“Java免费学习笔记(深入)”;
-
document、window、Element等 DOM 接口 -
fetch()、WebSocket、localStorage -
setTimeout、addEventListener、URL构造函数 - Canvas、Geolocation、Web Workers 等高级能力
这些 API 在 ES 标准里完全不出现。它们由宿主环境提供,并挂载到全局对象(如浏览器的 window)上,JS 引擎只是执行调用,具体实现由浏览器底层完成。
两者协同工作的典型例子
写一行 fetch('/api/user').then(res => res.json()),背后是两层协作:
- ECMAScript 提供
fetch函数调用机制、Promise对象、.then方法、箭头函数语法、res.json()返回的 Promise 解析逻辑 - Web API 提供
fetch函数本身、Response对象结构、网络请求调度、跨域检查等实际能力
如果换到 Node.js 环境,fetch 就不存在(除非手动引入 polyfill 或使用 node-fetch),但 Promise.then 和箭头函数照常工作——这正体现了标准与宿主的分离。
开发者需要区分两者的边界
遇到问题时,先判断是语言级还是环境级:
- 报错
ReferenceError: Promise is not defined→ 浏览器太老,ES6 的Promise未实现(需 polyfill) - 报错
TypeError: fetch is not a function→ 当前环境不是浏览器(如纯 Node.js),缺少 Web API -
document.getElementById在 Node.js 中不可用 → 正常,DOM 是 Web API,非 JS 语言本体
现代前端工具链(如 TypeScript、Babel、ESLint)也常按此分层配置:Babel 转译 ES 新语法,而 Webpack 或 Rollup 处理全局 API 的模拟或注入。









