do表达式不可用,因其是已撤回的ecmascript提案(2023年撤销),未被任何主流引擎实现,直接使用会报syntaxerror;替代方案是iife,如const x = (() => { const t = f(); return t * t + 1})();

do 表达式在当前所有主流浏览器和 HTML 环境中均不可用,不是合法的 JavaScript 语法,直接写会报 SyntaxError: Unexpected token 'do'。
为什么 do 表达式不能在 HTML 中使用
它只是 ECMAScript 的一个已撤回提案(Stage 1 → withdrawn in 2023),从未进入标准,也没有被 V8、SpiderMonkey 或 JavaScriptCore 实现。你在 MDN、CanIUse 或 TypeScript 官方文档里都查不到它;所有所谓“let x = do { ... }”的示例,都是早期草案或教学误传。
- Chrome / Firefox / Safari 解析到
do{就会立即抛出SyntaxError,哪怕包裹在<script></script>里 - TypeScript 也不支持,即使设
target: "esnext",编译阶段就报错 - 打包工具(如 webpack、vite)不会转译它——因为没有对应的 Babel 插件,Babel 官方明确不维护该提案
替代方案:用 IIFE 模拟 do 表达式行为
如果你真需要“块级作用域 + 返回值”,最可靠、零兼容性风险的方式是立即执行函数表达式(IIFE):
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
const x = (() => {
const t = f();
return t * t + 1;
})();
- 语义清晰:显式函数调用,返回值明确
- 作用域隔离:内部
const/let不泄漏 - 全环境可用:ES5+ 浏览器、Node.js、打包/压缩工具全部支持
- 注意不要写成
function(){...}()(缺少括号包裹会导致解析为函数声明而非表达式)
别被“块级作用域有返回值”误导
JavaScript 的普通块 { ... } 本身永远不返回值,这是语言基础规则:
-
{ let a = 1; a + 1 }不产生值,单独执行无意义 -
if (true) { let a = 1; a + 1 }中的a + 1被计算但被丢弃 - 只有表达式语句(如三元运算、逻辑运算、函数调用)才有返回值,块不是表达式
- 所谓“
do让块变成表达式”,本质是提案想改语法层级,但它失败了
真正要小心的,是把旧博客里未落地的提案当真去调试——花半天查为什么 do 报错,不如直接用 IIFE 写完跑起来。提案撤回后,连 TC39 仓库里都删掉了相关 issue。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










