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 来命名变量和函数,这会导致函数被变量遮蔽,无法正常调用。
解决办法:修改变量名就行了。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值