【问题标题】:Default Value in Destructured Function Parameter Causes ReferenceError解构函数参数中的默认值导致 ReferenceError
【发布时间】:2020-07-21 07:47:36
【问题描述】:

出于测试目的,我需要在我的 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

【问题讨论】:

    标签: javascript firebase testing default-value destructuring


    【解决方案1】:

    这就是作用域在函数声明参数列表中的工作方式。默认参数值上下文的范围包括参数列表本身(嗯,已经声明的那些)。因此,db 参数隐藏了导入中相对全局的符号。

    您也可以通过更改参数名称来解决此问题:

    function getUsers({database = db})
    

    范围以这种方式工作,因此可以在参数列表中使用参数列表中较早的参数用于列表中稍后的参数的表达式:

    function something(a, b = a + 1)
    

    something(0) 这样调用该函数会将b 设置为1。

    哦,重新阅读您的问题,将参数初始化为自身不起作用,因为它没有意义;如果函数调用中没有参数,则为undefined,因此将默认值显式设置为undefined 是不正确的。

    【讨论】:

    • 这是一个非常清晰和有用的解释。感谢您的及时答复!是的,我也有建议的解决方法,但随后将其更改为前面提到的,因为在我的测试中我将不得不使用 database: db 调用该函数 - 我不知何故不喜欢。
    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 2021-03-10
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多