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

Node环境下仅ECMAScript模块中未声明变量赋值抛ReferenceError问题咨询

结论

该现象确实和ECMAScript模块的特性直接相关,核心关联逻辑是ESM默认强制启用严格模式,而CommonJS默认运行在非严格模式,两者对未声明变量的赋值行为规则完全不同。

具体原因分析

你提供的代码中存在一处未声明变量的赋值操作:

test(myCallback = function () { console.log('done'); });

此处的myCallback没有使用var/let/const进行变量声明,直接进行了赋值操作,两种模块规范对该操作的处理逻辑如下:

  • CommonJS规范下,Node.js 默认将模块运行在非严格模式。非严格模式允许对未声明的变量直接赋值:JS引擎会自动在全局作用域创建一个名为myCallback的全局属性,赋值操作合法,因此回调函数可以正常传入test执行,最终输出done。
  • ECMAScript模块规范强制要求所有模块默认运行在严格模式(无需手动声明'use strict')。严格模式明确禁止对未声明的变量进行赋值操作,只要出现该场景就会直接抛出ReferenceError: myCallback is not defined,因此代码无法正常运行。

兼容修复方案

只要对myCallback补充变量声明,即可同时在两种规范下正常运行,比如修改为:

const test = function (cb) { cb(); };
// 方案1:直接传入函数表达式,无需额外变量
test(function () { console.log('done'); });

// 方案2:提前声明变量再传入
const myCallback = function () { console.log('done'); };
test(myCallback);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:21:02