क्या निम्नलिखित कोड काम करना चाहिए?

(async () => {
  await new Promise(r => setTimeout(r, 1000))
  useNum();
})();

let num = 10;
function useNum() {
  return num + 1;
}

https://jsbin.com/tayotitepa/edit?html,output

आईओएस पर सफारी (v13.3) का कहना है कि यह असंभव है (num चर मौजूद नहीं है), जबकि क्रोम और फ़ायरफ़ॉक्स को लगता है कि यह ठीक है।

यदि आप await new Promise... लाइन हटाते हैं तो क्रोम और फायरफॉक्स शिकायत करते हैं।

ऐसा लगता है कि क्रोम और फ़ायरफ़ॉक्स यहाँ सही हैं, क्योंकि हम await तुरंत लागू किए गए async फ़ंक्शन में नहीं हैं, और इसलिए जब तक await new Promise... लाइन समाप्त हो जाती है, तब तक बाकी स्क्रिप्ट पहले ही हो चुकी होगी संसाधित किया गया। लेकिन मैंने सोचा कि मैं जांच करूंगा क्योंकि शायद कल्पना कहती है कि यह उन चरों के चर और उपयोगों की घोषणा के आदेश के बारे में सख्ती से है, और इसलिए यह "समय" के बारे में कोई फर्क नहीं पड़ता चर का उपयोग।

2
joe 15 फरवरी 2020, 16:21
मुझे नहीं लगता कि इस मुद्दे का async/await से कोई लेना-देना है। सफारी बस गलत है।
 – 
Pointy
15 फरवरी 2020, 16:25
साथ ही, let और const हैं को फहराया जाता है; यह केवल var उत्थापन से भिन्न कार्य करता है।
 – 
Pointy
15 फरवरी 2020, 16:28
हाई सिएरा की सफारी पर ठीक काम करता है
 – 
CertainPerformance
15 फरवरी 2020, 16:43

1 उत्तर

मैंने इसे विभिन्न परिदृश्यों के साथ करने की कोशिश की, मैंने जो देखा वह वह है

  1. async/प्रतीक्षा का इससे कोई लेना-देना नहीं है।
  2. let num फहराया जाता है लेकिन मान undefined होता है।

तो कोड कुछ ऐसा दिखता है

let num; // --- hoisted with value as undefined
setTimeout(() => {}, 1000)
console.log(useNum());

num = 10; // --- value is assigned here
function useNum(str) {
  return num + 1;
}

जैसा कि आप जानते हैं कि जावा-स्क्रिप्ट समकालिक है, अर्थात यह प्रत्येक पंक्ति को एक समय में निष्पादित करती है, इसलिए जब हम उस समय useNum विधि को कॉल कर रहे हैं num अपरिभाषित हो जाएगा।

-2
Mujibur Rehman Ansari 15 फरवरी 2020, 16:43
1
आपका कोड ओपी से अलग है। यह setTimeout(() => {console.log(useNum()}, 1000) होना चाहिए
 – 
David Callanan
15 फरवरी 2020, 17:57