मैं बंद को समझने की कोशिश कर रहा हूं, मैंने सोचा कि जब तक मैं निम्नलिखित समाधान में नहीं आया तब तक मैं इसे समझ गया:

मुझे समझ में नहीं आता कि यह 0, 1, 2, 3, 4, 5 . को कैसे अलर्ट करेगा

var next = (function(){
    var r = 0;
  return function(){
    return r++;
  }

})()

for (var i = 0; i<=5; i++){
    alert(next());
}

मैं समझता हूं कि पहला पुनरावृत्ति कैसे काम करता है, बस next होने पर, फ़ंक्शन निष्पादित होगा और रिटर्न फ़ंक्शन वापस कर देगा, फिर अतिरिक्त () अगले के बाद उस लौटाए गए फ़ंक्शन को निष्पादित करेगा। मैं यह भी समझता हूं कि निष्पादित होने पर रिटर्न फ़ंक्शन को क्लोजर के कारण वेरिएबल r तक पहुंच प्राप्त होगी।

हालाँकि मुझे समझ में नहीं आता कि अगले पुनरावृत्ति पर, r की स्थिति कैसे बनी रहेगी। अगले पुनरावृत्ति पर जब next() फिर से चलाया जाता है, तो r चर फ़ंक्शन के दायरे के अंदर होगा और वैश्विक किसी भी चीज़ से प्रभावित नहीं होगा, यह कैसे है कि यह r की स्थिति को जानता है पिछले next() में। अगर ऐसा होता भी है, तो क्या var r = 0 r को वापस 0 पर रीसेट नहीं करेगा?

3
user1294510 6 अक्टूबर 2018, 07:41

1 उत्तर

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

बाहरी आईआईएफई केवल एक बार चलता है, जैसा कि अंत में () द्वारा दर्शाया गया है:

var next = (function(){
  var r = 0;
  return function(){
    return r++;
  }
})()
  ^^

इसलिए, जब दुभाषिया var next = ... लाइन के पार आता है, तो IIFE चलता है, r वैरिएबल बनाता है, और फिर निम्नलिखित फ़ंक्शन देता है:

function(){
  return r++;
}

next को IIFE को कॉल करने के परिणाम के लिए असाइन किया गया है, और IIFE उस फ़ंक्शन को वापस कर देता है। इसलिए, भविष्य में, जब आप next को कॉल करते हैं, तो आप उस (छोटा) फ़ंक्शन को ऊपर कॉल कर रहे हैं - next को कॉल करना पूरे IIFE को फिर से कॉल नहीं करता है, और next के लिए केवल एक ही बाध्यकारी है। r चर।

क्या next एक अनइनवोक्ड फ़ंक्शन था जिसने एक r बनाया, आप सही होंगे, next का प्रत्येक आह्वान next के लिए एक नए बाइंडिंग के साथ एक नया फ़ंक्शन बनाएगा। r:

var next = function(){
  var r = 0;
  return function(){
    return r++;
  }
}

for (var i = 0; i<=5; i++){
  var theFn = next();
  console.log(theFn());
}
3
CertainPerformance 6 अक्टूबर 2018, 04:46