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
相关产品推荐
相关产品推荐

