जावास्क्रिप्ट में IIFE के खतरे
आइए कोड के दो टुकड़ों पर नज़र डालते हैं।
पहला:
javascriptlet result = 1
+function() {
return 2;
}();
console.log(result);
दूसरा:
javascriptlet result = 1;
+function() {
return 2;
}();
console.log(result);
ये दोनों कोड टुकड़े लगभग एक जैसे हैं,
लेकिन अगर उन्हें चलाया जाए - परिणाम अलग होगा।
पहला कोड कंसोल में संख्या 3 दिखाएगा,
जबकि दूसरा - संख्या 1।
इतना अंतर क्यों आया: सारा मामला इस बात में है कि एक मामले में पहली पंक्ति के अंत में सेमीकॉलन नहीं है, जबकि दूसरे मामले में - है।
आप पूछ सकते हैं: यह कैसे हो सकता है, आखिर जावास्क्रिप्ट में कमांड के अंत में सेमीकॉलन अनिवार्य नहीं है! असल में यह पूरी तरह से सही नहीं है। आइए समझते हैं, कि वास्तव में क्या हो रहा है।
पहले कोड को इस तरह से फिर से लिखा जा सकता है:
javascriptlet result = 1 + function() {
return 2;
}();
console.log(result); // 3 दिखाएगा
अब तुरंत स्पष्ट हो जाता है कि
एक में फ़ंक्शन कॉल के परिणाम को
जोड़ा जा रहा है, यानी 2। इसलिए अंतिम
परिणाम 3 होगा।
अगर एक के बाद सेमीकॉलन लगा दिया जाए, तो कोड इंटरप्रेटर द्वारा अलग तरह से समझा जाएगा:
javascript// पहला कमांड:
let result = 1;
// दूसरा कमांड:
+function() {
return 2;
}();
// तीसरा कमांड:
console.log(result); // 1 दिखाएगा
यानी वेरिएबल में असाइनमेंट और तुरंत कalled फ़ंक्शन अलग-अलग कमांड बन जाएंगे। और सब सेमीकॉलन की मौजूदगी की वजह से!
इसका मतलब है कि इस मामले में तुरंत कalled फ़ंक्शन
असल में कुछ भी नहीं करता - बस
कहीं नहीं संख्या 2 लौटाता है, जो
वेरिएबल result पर कोई प्रभाव नहीं डालता।
आइए फिर समझते हैं, कि आखिर हम जावास्क्रिप्ट में सेमीकॉलन क्यों नहीं लिख सकते। मान लीजिए हमारे पास सेमीकॉलन के बिना ऐसा कोड है:
javascriptlet result = 1 // result में 1 लिखा जाएगा
let test = 2 // test में 2 लिखा जाएगा
यह सही ढंग से काम करता है, क्योंकि इंटरप्रेटर ने खुद ही प्रत्येक पंक्ति के अंत में सेमीकॉलन लगा दिया।
लेकिन इस कोड पर एक नज़र डालें:
javascriptlet result = 1
+ 2; // result में 3 लिखा जाएगा
अब पहली पंक्ति के अंत में सेमीकॉलन स्वचालित रूप से नहीं लगेगा, क्योंकि इंटरप्रेटर समझता है कि दूसरी पंक्ति का कमांड पहली पंक्ति के कमांड का हिस्सा है।
लेकिन अगर हम खुद सेमीकॉलन लगा दें - परिणाम पूरी तरह से अलग होगा:
javascriptlet result = 1; // result में 1 लिखा जाएगा
+ 2; // कमांड कुछ नहीं करती, लेकिन त्रुटि भी नहीं होगी
इसका मतलब है कि इंटरप्रेटर खुद सेमीकॉलन तभी लगाता है, जब अगला कमांड पिछले कमांड का हिस्सा नहीं है।
और अब इस कोड को देखें:
javascriptlet result = 1
+function() {
return 2;
}();
console.log(result);
दरअसल, दूसरी पंक्ति - पहली पंक्ति के कमांड की निरंतरता है और इंटरप्रेटर सेमीकॉलन स्वचालित रूप से नहीं लगाता। यही कारण है कि, अगर हम खुद पहली पंक्ति के अंत में सेमीकॉलन लिखें - परिणाम पूरी तरह से अलग होगा। यह बताता है कि समस्याओं से बचने के लिए, हमेशा जरूरी जगहों पर सेमीकॉलन लगाना सबसे अच्छा है।