解构函数参数中的默认值导致ReferenceError
Default Value in Destructured Function Parameter Causes ReferenceError
出于测试目的,我需要在我的 CRUD 函数中为 db
设置一个默认值,但遇到了一个奇怪的行为,我还无法弄清楚。考虑以下代码:
import { db } from './firebase'
function getUsers({ db = db }) {
try {
return db
...
现在,当我在测试中使用该函数时,没有问题,因为我使用测试数据库在测试文件中调用了该函数。但真正的应用程序应该能够退回到默认值并在没有任何参数的情况下调用该函数。
但是在这里,我遇到了错误:ReferenceError: can't access lexical declaration 'db' before initialization
。我不知道为什么会这样。
我通过重命名参数找到了解决方法。但是,我真的很想知道这里发生了什么。有人有想法吗?
解决方法:
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。
哦,重新阅读你的问题,将参数初始化为自身是行不通的,因为,好吧,它没有意义;如果参数在函数调用中不存在,那么它是 undefined
,因此将默认值明确设为 undefined
是不正确的。
出于测试目的,我需要在我的 CRUD 函数中为 db
设置一个默认值,但遇到了一个奇怪的行为,我还无法弄清楚。考虑以下代码:
import { db } from './firebase'
function getUsers({ db = db }) {
try {
return db
...
现在,当我在测试中使用该函数时,没有问题,因为我使用测试数据库在测试文件中调用了该函数。但真正的应用程序应该能够退回到默认值并在没有任何参数的情况下调用该函数。
但是在这里,我遇到了错误:ReferenceError: can't access lexical declaration 'db' before initialization
。我不知道为什么会这样。
我通过重命名参数找到了解决方法。但是,我真的很想知道这里发生了什么。有人有想法吗?
解决方法:
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。
哦,重新阅读你的问题,将参数初始化为自身是行不通的,因为,好吧,它没有意义;如果参数在函数调用中不存在,那么它是 undefined
,因此将默认值明确设为 undefined
是不正确的。