只有在使用 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);
我有一个文件 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);