Значение по умолчанию в разрушенной функции Параметр Причины ReferenceError - PullRequest
0 голосов
/ 08 апреля 2020

Мне нужно было установить значение по умолчанию для db в моих функциях CRUD для целей тестирования, и я столкнулся со странным поведением, я пока не мог понять. Рассмотрим следующий код:

import { db } from './firebase'

function getUsers({ db = db }) {
  try {
    return db
    ...

Теперь, когда я использую функцию в своих тестах, проблем нет, так как я вызываю функцию в моем тестовом файле с тестовой базой данных. Но реальное приложение должно иметь возможность использовать значение по умолчанию и вызывать функцию без каких-либо параметров. Но здесь я сталкиваюсь с ошибкой: ReferenceError: can't access lexical declaration 'db' before initialization. Я понятия не имею, почему это происходит.

Я нашел обходной путь, переименовав параметр. Но все же мне бы очень хотелось узнать, что здесь происходит. У кого-нибудь есть идея?

Workarond:

import * as firebase from './firebase'

function getUsers({ db = firebase.db }) {
  try {
    return db

1 Ответ

0 голосов
/ 08 апреля 2020

Так работает область видимости в списках параметров объявления функции. Область контекста значения аргумента по умолчанию включает сам список параметров (ну, те, которые уже объявлены). Таким образом, параметр db скрывает относительно глобальный символ из импорта.

Вы также можете обойти проблему, изменив имя параметра:

function getUsers({database = db})

Область действия работает таким образом, что возможно использовать параметры ранее в списке параметров в выражениях для параметров позже в списке:

function something(a, b = a + 1)

Вызов такой функции, как something(0), установит b в 1.

О, и перечитывание вашего вопроса, инициализация параметра для себя не работает, потому что, ну, это не имеет смысла; если параметр отсутствует в вызове функции, то это undefined, поэтому значение по умолчанию, равное undefined, явно неверно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...