एलोक्वेंट जावास्क्रिप्ट पुस्तक के पहले संस्करण में, पृष्ठ 67 में निम्नलिखित कोड है, उप-अध्याय "अपवादों के बाद सफाई" के तहत:

var currentThing = null;

function processThing(thing) {
    var prevThing = currentThing;
    currentThing = thing;
    /* do complicated processing... */
    currentThing = prevThing;
}

अंत में prevThing से currentThing को पुन: असाइन करने का तर्क क्या है?

यहाँ है, हमने पहले ही currentThing को prevThing को असाइन किया है, और फिर currentThing को thing में बदल दिया है, तो पिछले पुन: असाइनमेंट में क्या स्वाद है?

0
user9303970 28 मार्च 2018, 05:04

3 जवाब

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

अंतिम असाइनमेंट बेकार नहीं है क्योंकि currentThing एक वैश्विक चर है।

एक बिंदु बनाने के लिए, लेखक कुछ काल्पनिक परिदृश्य का प्रस्ताव करता है, एक पल के लिए, जबकि /* do complicated processing... */ होता है, आप चाहते हैं कि thing का मूल्य विश्व स्तर पर (currentThing के माध्यम से) दूसरों के लिए उजागर हो। उपभोग करने के लिए।

प्रसंस्करण के बाद, लेखक बताता है कि इस तरह के काल्पनिक परिदृश्य में, आप प्रसंस्करण शुरू होने से पहले currentThing को इसके मूल्य पर पुनर्स्थापित करना चाहते थे (prevThing में संग्रहीत मूल्य)।

यह सब त्रुटि प्रबंधन के संदर्भ में होता है। लेखक आपको यह बताने के लिए इतना जटिल परिदृश्य बनाता है कि यदि आप कुछ गणना के बाद कुछ चर को रीसेट करना चाहते हैं तो आपको गणना को try ब्लॉक में लपेटना चाहिए और रीसेट को finally में इस प्रकार करें:

var currentThing = null;

function processThing(thing) {
    var prevThing = currentThing;
    currentThing = thing;
    try {
      /* do complicated processing... */
    } finally {
      // now you'll reset currentThing to its previous value,
      // no matter if the complicated processing errors or not
      currentThing = prevThing;
    }
}

ताकि कोई भी त्रुटि जो जटिल प्रसंस्करण द्वारा फेंकी जा सकती है वह currentThing के रीसेटिंग को प्रभावित नहीं करेगी।

1
acdcjunior 28 मार्च 2018, 02:18

यह सभी पुनरावृत्तियों के लिए [null, n] दिखाएगा। तो यह कोड में गलती हो सकती है।

var currentThing = null;

function processThing(thing) {
  var prevThing = currentThing;
  currentThing = thing;

  console.log(prevThing, currentThing);

  currentThing = prevThing;
}

var data = [1,2,3,4,5,6,7];

data.forEach(processThing);

यदि आप आइटम को पिछले पुनरावृत्ति से एक्सेस करना चाहते हैं, तो आपको इसे थोड़ा सही करने की आवश्यकता है।

var prevThing = null;

function processThing(currentThing) {
  /* do complicated processing... */
  console.log(prevThing, currentThing);

  prevThing = currentThing;
}

var data = [1,2,3,4,5,6,7];

data.forEach(processThing);
0
Vayrex 28 मार्च 2018, 02:20

इसका कारण यह है कि यदि /* do complicated processing... */ में आप अन्य कार्यों को उसी दायरे में कॉल करना चाहते हैं, लेकिन किसी कारण से thing को तर्क के रूप में पसंद करते हैं या नहीं कर सकते हैं, तो currentThing चर बनाता है उन कार्यों के लिए उपलब्ध वस्तु। एक बार जटिल प्रसंस्करण हो जाने के बाद, currentThing को या तो पिछले मान पर वापस सेट किया जा सकता है या अधिक ठीक से null

0
Behrooz 28 मार्च 2018, 02:15