Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解构函数参数中的默认值导致ReferenceError_Javascript_Firebase_Testing_Default Value_Destructuring - Fatal编程技术网

Javascript 解构函数参数中的默认值导致ReferenceError

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

出于测试目的,我需要在CRUD函数中为
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
-调用函数,我不喜欢这样做。