只有在使用 ECMAScript 模块时,对未声明变量的赋值才会在 Node 中抛出 ReferenceError

Assignment to an undeclared variable throws ReferenceError in Node only when using ECMAScript modules

我有一个文件 index.js,其中包含以下内容:

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

当我 运行 index.js 使用 Node v16.6.1 和 CommonJS 时:

done

当我 运行 index.js 在我的 package.json 文件中使用 Node v16.6.1 和 "type": "module" 时:

ReferenceError: myCallback is not defined

你能告诉我这是否与 ECMAScript 模块有关吗?

这是使用 ESM 的副作用。默认情况下启用严格模式 (use strict)。导致错误的原因是:myCallback isn't declared anywhere.

let myCallback;
test(myCallback = function () { console.log('done'); }); // here we assign myCallback to a function. are you sure you want to actually do this?

之前,您试图创建一个全局变量。

First, strict mode makes it impossible to accidentally create global variables. [...] Assignments, which would accidentally create global variables, instead throw an error in strict mode

函数的命名方式有两种。您可以将变量设置为等于函数。或者你可以给一个函数一个名字。这里有两种方法可以解决你的问题

为函数命名

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

设置变量等于函数

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