मुझे परीक्षण उद्देश्यों के लिए अपने सीआरयूडी कार्यों में 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
0
Albert Schilling 8 अप्रैल 2020, 22:26

1 उत्तर

सबसे बढ़िया उत्तर

फ़ंक्शन डिक्लेरेशन पैरामीटर सूचियों में स्कोप इस तरह काम करता है। डिफ़ॉल्ट तर्क मान संदर्भ का दायरा शामिल है पैरामीटर सूची ही (ठीक है, पहले से ही घोषित)। इस प्रकार db पैरामीटर आयात से अपेक्षाकृत वैश्विक प्रतीक को छायांकित करता है।

आप पैरामीटर नाम बदलकर समस्या का समाधान भी कर सकते हैं:

function getUsers({database = db})

दायरा इस तरह से काम करता है ताकि बाद में सूची में पैरामीटर के लिए अभिव्यक्तियों में पैरामीटर सूची में पहले पैरामीटर का उपयोग करना संभव हो:

function something(a, b = a + 1)

something(0) जैसे फ़ंक्शन को कॉल करना b को 1 पर सेट कर देगा।

ओह, और अपने प्रश्न को दोबारा पढ़ना, पैरामीटर को स्वयं शुरू करना काम नहीं करता है, ठीक है, इसका कोई मतलब नहीं है; यदि पैरामीटर फ़ंक्शन कॉल में नहीं है, तो यह undefined है, इसलिए डिफ़ॉल्ट मान undefined होना स्पष्ट रूप से गलत है।

1
Pointy 8 अप्रैल 2020, 19:45