JavaScript में "use strict" क्या है और इस पर बहस क्यों होती है?
\n\nक्या आपने कभी JavaScript कोड लिखा है जो "अजीब तरह से" काम करता था? कोई वेरिएबल अपने आप घोषित हो गया, this आपकी अपेक्षा के अनुसार किसी ऑब्जेक्ट के बजाय ग्लोबल ऑब्जेक्ट की ओर इशारा कर रहा था, और त्रुटि चुपचाप निगल ली गई थी? "गंदे" JS की दुनिया में आपका स्वागत है।
"use strict" निर्देश कोई फंक्शन या ऑपरेटर नहीं है। यह आपकी स्क्रिप्ट या फंक्शन के लिए एक मोड स्विच है। जब आप फ़ाइल या फंक्शन की शुरुआत में "use strict" लिखते हैं, तो आप JavaScript इंजन से कह रहे हैं: "अरे, मेरी गलतियों को मत माफ करो। सख्त बनो, लेकिन ईमानदार बनो।"
यह विषय Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है (हजारों व्यूज)। आइए समझते हैं कि सख्त मोड वास्तव में क्या करता है, इसे क्यों बनाया गया, और इसका उपयोग करके अपने पैर में गोली कैसे न मारें।
\n\nसख्त मोड कैसे चालू करें?
\n\nकेवल दो तरीके हैं:
\n\n- \n
- ग्लोबल (पूरी स्क्रिप्ट के लिए): फ़ाइल की पहली पंक्ति में
"use strict";। \n - लोकल (फंक्शन के लिए): फंक्शन बॉडी की पहली पंक्ति में
"use strict";। \n
// ग्लोबल सख्त मोड\n"use strict";\nlet x = 10;\n\n// लोकल सख्त मोड\nfunction myFunc() {\n "use strict";\n let y = 20;\n}\n\nमहत्वपूर्ण: यदि आप एक ही फ़ाइल में सख्त और गैर-सख्त कोड मिलाते हैं (जैसे, स्क्रिप्ट को जोड़ना), तो समस्याएँ हो सकती हैं। अलग-अलग फंक्शन या मॉड्यूल के लिए सख्त मोड का उपयोग करना बेहतर है (ES6 मॉड्यूल स्वचालित रूप से सख्त होते हैं)।
\n\nशीर्ष 5 त्रुटियाँ जिन्हें "use strict" रोकता है
\n\n"use strict" का मुख्य उद्देश्य JavaScript की "मौन" त्रुटियों को स्पष्ट अपवादों (ऐसी त्रुटियाँ जो फेंकी जाती हैं और पकड़ी जा सकती हैं) में बदलना है। यहाँ 5 सबसे सामान्य मामले हैं।
1. अंतर्निहित ग्लोबल वेरिएबल्स के निर्माण पर प्रतिबंध
\n\nयह क्लासिक है। सामान्य मोड में, यदि आप var, let या const लिखना भूल जाते हैं, तो वेरिएबल स्वचालित रूप से ग्लोबल हो जाता है। इससे मुश्किल से पकड़ में आने वाले बग हो सकते हैं।
// "use strict" के बिना\nfunction sum(a, b) {\n total = a + b; // त्रुटि? नहीं। total एक ग्लोबल वेरिएबल बन गया!\n}\nsum(2, 3);\nconsole.log(total); // 5 — काम करता है, लेकिन यह भयानक है।\n\n// "use strict" के साथ\n"use strict";\nfunction sumStrict(a, b) {\n total = a + b; // ReferenceError: total is not defined\n}\nsumStrict(2, 3); // त्रुटि! कोड तुरंत फेल हो जाएगा।\n\nकैसे बचें? हमेशा वेरिएबल घोषित करें। आकस्मिक ग्लोबल वेरिएबल और होइस्टिंग से बचने के लिए var के बजाय let और const का उपयोग करें।
2. गैर-लेखनीय गुणों को मान निर्दिष्ट करना
\n\nसामान्य मोड में, JavaScript NaN, undefined या फ्रोजन ऑब्जेक्ट को बदलने के प्रयास को चुपचाप अनदेखा कर देता है। सख्त मोड में, एक त्रुटि उत्पन्न होगी।
"use strict";\n\n// NaN को ओवरराइट करने का प्रयास\nNaN = 123; // TypeError: Cannot assign to read only property 'NaN'\n\n// फ्रोजन ऑब्जेक्ट को बदलने का प्रयास\nconst obj = Object.freeze({name: "Alice"});\nobj.name = "Bob"; // TypeError: Cannot assign to read only property 'name'\n\nकैसे बचें? बिल्ट-इन कॉन्स्टेंट को फिर से परिभाषित करने का प्रयास न करें। Object.freeze() का सोच-समझकर उपयोग करें।
3. वेरिएबल, फंक्शन और आर्गुमेंट्स को हटाना
\n\nआप var या let के माध्यम से घोषित वेरिएबल या किसी फंक्शन को हटा नहीं सकते। सामान्य मोड में, इसे केवल अनदेखा किया जाता है।
"use strict";\n\nvar x = 10;\ndelete x; // SyntaxError: Delete of an unqualified identifier in strict mode.\n\nfunction foo() {}\ndelete foo; // SyntaxError\n\nकैसे बचें? वेरिएबल के लिए delete का उपयोग न करें। इसकी आवश्यकता केवल ऑब्जेक्ट के गुणों को हटाने के लिए है: delete obj.prop।