Javascript 解构函数参数中的默认值导致ReferenceError
出于测试目的,我需要在CRUD函数中为Javascript 解构函数参数中的默认值导致ReferenceError,javascript,firebase,testing,default-value,destructuring,Javascript,Firebase,Testing,Default Value,Destructuring,出于测试目的,我需要在CRUD函数中为db设置一个默认值,但遇到了一个奇怪的行为,我还无法理解。考虑下面的代码: import { db } from './firebase' function getUsers({ db = db }) { try { return db ... 现在,当我在测试中使用该函数时,没有问题,因为我使用测试数据库在测试文件中调用该函数。但是真正的应用程序应该能够返回默认值,并且在没有任何参数的情况下调用函数。 但是在这里,我遇到了错误:Re
db
设置一个默认值,但遇到了一个奇怪的行为,我还无法理解。考虑下面的代码:
import { db } from './firebase'
function getUsers({ db = db }) {
try {
return db
...
现在,当我在测试中使用该函数时,没有问题,因为我使用测试数据库在测试文件中调用该函数。但是真正的应用程序应该能够返回默认值,并且在没有任何参数的情况下调用函数。
但是在这里,我遇到了错误:ReferenceError:在初始化之前无法访问词法声明“db”
。我不知道为什么会这样
我通过重命名参数找到了解决方法。不过,我还是很想知道这里发生了什么。有人有主意吗
变通办法:
import * as firebase from './firebase'
function getUsers({ db = firebase.db }) {
try {
return db
这就是作用域在函数声明参数列表中的工作方式。默认参数值上下文的范围包括参数列表本身(好的,是已经声明的参数列表)。因此,
db
参数会从导入中隐藏相对全局的符号
您还可以通过更改参数名称来解决此问题:
function getUsers({database = db})
作用域以这种方式工作,因此可以在表达式中使用参数列表中较早的参数,以用于列表中稍后的参数:
function something(a, b = a + 1)
像something(0)
那样调用该函数将b
设置为1
哦,重读你的问题,初始化一个参数到它本身是不起作用的,因为它没有意义;如果函数调用中没有参数,那么它是未定义的,因此将默认值显式设置为未定义是不正确的。这是一个非常清楚和有用的解释。谢谢你的及时答复!是的,我还准备了建议的解决方法,但后来将其更改为上述方法,因为在我的测试中,我必须使用
database:db
-调用函数,我不喜欢这样做。