NodeJS报错Cannot access ‘xxx‘ before initialization排查解决

说明

我在写Nodejs时,正在测试一个方法,报错

ReferenceError: Cannot access ‘isSaved’ before initialization
at test ?[90m(E:\idea项目\sifanERP\dev\src\non_core?[39mtest.js:52:21?[90m)?[39m
at Object. ?[90m(E:\idea项目\sifanERP\dev\src\non_core?[39mtest.js:57:1?[90m)?[39m
?[90m at Module._compile (node:internal/modules/cjs/loader:1126:14)?[39m
?[90m at Object.Module._extensions…js (node:internal/modules/cjs/loader:1180:10)?[39m
?[90m at Module.load (node:internal/modules/cjs/loader:1004:32)?[39m
?[90m at Function.Module._load (node:internal/modules/cjs/loader:839:12)?[39m
?[90m at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)?[39m
?[90m at node:internal/main/run_main_module:17:47?[39m

很懵逼啊。

排查过程

代码如下:

async function isSaved(asin) {
    return asin
}

async function test() {
    const isSaved = await isSaved("B08FT159")
    console.log(isSaved)
}

test()

很简单的东西,就是测试一下isSaved方法会返回什么,竟然直接报错。
然后我写了一个名字不同,但是作用一样的方法

async function isSaved2(asin) {
    return asin
}

async function isSaved(asin) {
    return asin
}

async function test() {
    const isSaved = await isSaved2("B08FT159")
    console.log(isSaved)
}

结果如下:是没有问题的

E:\idea项目\sifanERP\dev\src\non_core>node test.js
B08FT159

通过上面的测试,可以知道是方法名有问题,我起初认为isSaved是nodejs的保留字呢。
通过查询nodejs的保留字有如下:

break, case, catch, class, const, continue, debugger, default, delete, do, else, enum, export, extends, finally, for, function, if, implements, import, in, instanceof, interface, let, new, package, private, protected, public, return, static, super, switch, this, throw, try, typeof, var, void, while, with, yield

最后发现是const isSaved = await isSaved("B08FT159")变量名和方法名一样了,导致报错。
变量名重复: 在同一个作用域内使用了相同的名称 isSaved 来命名变量和函数,这会导致函数被变量遮蔽,无法正常调用。
解决办法:修改变量名就行了。

你可能感兴趣的:(javascript,开发语言,ecmascript)