{} में फ़ंक्शन घोषणा के बारे में उलझन में


18

var a;
if (true) {
  a = 5;

  function a() {}
  a = 0;
  console.log(a)
}
console.log(a)

मैंने ऊपर कोड देखा, एक फ़ंक्शन {} में घोषित किया गया है। मुझे लगता है कि यह 0 0 प्रिंट करेगा, लेकिन यह 0 5 प्रिंट करता है



1
सख्त मोड में, यह लॉग करता है 0 undefined।
— 6

@ खोजप्रक्रिया, अच्छी तरह से व्याख्या करने योग्य है, लेकिन मैं यह समझाने में विफल हूं कि a = 5ब्लॉक को छोड़ देता है। दुपट्टे में बर्गी के अनुसार function aफहराया जाएगा।
— जोनास विल्म्स

2
ऐसा लगता है जैसे फ़ंक्शन घोषणा में पहुंचने पर स्थानीय रूप से स्कोप किया गया ब्लॉक वैरिएबल बाहरी ब्लॉक में कॉपी हो जाता है।
— जोनास विलम्स

जवाबों:


13

निम्नलिखित होता है:

(1) दो परिवर्तनशील घोषणाएँ मौजूद हैं a, एक ब्लॉक के अंदर और एक उसके बाहर।

(2) फ़ंक्शन घोषणा फहराया जाता है, और आंतरिक ब्लॉक चर के लिए बाध्य होता है।

(3) a = 5तक पहुँच जाता है, जो ब्लॉक चर को ओवरराइड करता है।

(4) फ़ंक्शन डिक्लेरेशन तक पहुंच गया है, और ब्लॉक वेरिएबल को बाहरी वेरिएबल में कॉपी किया गया है। दोनों अभी 5 हैं।

(5) a = 0तक पहुँच जाता है, जो ब्लॉक वैरिएबल को ओवरराइड करता है। बाहरी चर इससे प्रभावित नहीं है।

 var a¹;
 if (true) {
   function a²() {} // hoisted
   a² = 5;
   a¹ = a²; // at the location of the declaration, the variable leaves the block      
   a² = 0;
  console.log(a²)
}
console.log(a¹);

यह वास्तव में विनिर्देश का हिस्सा नहीं है, यह वेब विरासत संगतता शब्दार्थ का हिस्सा है , इसलिए ब्लॉक के अंदर फ़ंक्शन घोषित न करें और इस तरह से व्यवहार करने के लिए इस कोड पर भरोसा न करें ।

यह भी यहाँ बताया गया है


लेकिन एक बार जब फ़ंक्शन की घोषणा हो जाती है, तो ब्लॉक चर को बाहरी चर पर कॉपी किया जाएगा?
— चोर

@Chor नहीं, युक्ति ऐसा कहती है। मुझे कोई जानकारी नहीं है की क्यों।
— जोनास विल्म्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.