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