मैं जावास्क्रिप्ट के लिए नया हूं और ढेर के विषय पर आया हूं। कोड के निम्नलिखित भाग में (जो सिंटैक्स के बजाय मूल बातों पर ध्यान केंद्रित करने के लिए सरल है), मैं अपने फ़ंक्शन एक्सप्रेशन वेरिएबल के अंदर टाइमरआईडी को साफ़ कर सकता हूं। ऐसा करना काफी आम है, लेकिन मेरा सवाल यह है कि यहां स्टैक कैसे बनाया जाता है? अधिक स्पष्ट होने के लिए, चीजों का क्रम उस चर को कैसे साफ़ करता है जिसमें स्वयं स्पष्ट रहता है? और कैसे "console.log('DONE!')" clearInterval() के बाद कहा जाता है?


function countNumbers(number){
  var timer = setInterval(function(){
    number++;
    if(number >= 10){
      clearInterval(timer);
      console.log('DONE!');
    }
    else {
      console.log(number);
    }

  },1000)
}
2
BaN 10 सितंबर 2019, 20:40

1 उत्तर

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

जब एक आंतरिक फ़ंक्शन जावास्क्रिप्ट में एक बाहरी फ़ंक्शन के एक चर के संदर्भ को बनाए रखता है, तो एक क्लोज़र बनता है, अर्थात बाहरी फ़ंक्शन के सदस्य तब नष्ट नहीं होते हैं जब बाहरी फ़ंक्शन चल रहा होता है क्योंकि यह चर है अभी भी किसी अन्य फ़ंक्शन से संदर्भित किया जा रहा है।

ऐसा इसलिए है क्योंकि जब किसी फ़ंक्शन को निष्पादित किया जाता है तो उस फ़ंक्शन के वातावरण के लिए एक नया निष्पादन संदर्भ बनाया जाता है। यह एक गुंजाइश श्रृंखला बनाए रखता है और फिर निष्पादन के क्रम में निष्पादन स्टैक पर धकेल दिया जाता है।

एक वैश्विक निष्पादन संदर्भ है, फिर countNumbers का आह्वान अपना निष्पादन संदर्भ बनाता है और अंत में कॉलबैक का निष्पादन संदर्भ बनाया जाता है। कॉलबैक फ़ंक्शन निष्पादन संदर्भ countNumbers फ़ंक्शन के निष्पादन संदर्भ के दायरे में एक सूचक को बनाए रखता है जो वैश्विक के निष्पादन संदर्भ के लिए एक सूचक रखता है:

enter image description here

आपके मामले में, जब setInterval() इसे तुरंत/तुल्यकालिक रूप से चलाता है तो आईडी लौटाता है और यह timer चर में सेट हो जाता है। चूँकि timer वेरिएबल को countNumbers फंक्शन के दायरे में परिभाषित किया गया है, इनर/कॉलबैक फंक्शन इसके ऊपर एक क्लॉजर बनाता है। कॉलबैक का निष्पादन संदर्भ स्कोप श्रृंखला के माध्यम से timer चर तक पहुंच सकता है और उस तक पहुंच सकता है।

अब जब आप setInterval चलाते हैं तो कॉलबैक कतारबद्ध हो जाता है और निर्दिष्ट अंतराल पर अतुल्यकालिक रूप से निष्पादित होता है। पहले बने क्लॉजर के कारण कॉलबैक के पास बाहरी फ़ंक्शन स्कोप में घोषित timer वेरिएबल तक पहुंच है, इसलिए जब number 10 तक पहुंच जाता है तो यह आईडी के उस मान को बाहरी फ़ंक्शन स्कोप से रद्द करने के लिए उपयोग कर सकता है अंतराल।

1
Fullstack Guy 10 सितंबर 2019, 18:23