संख्यात्मक शाब्दिकों को पूरा करने के लिए उनके जुनून में, डेवलपर के पास अनजाने में bएक अष्टक शाब्दिक के साथ प्रारंभिक चर है । गैर-सख्त मोड इसे एक संख्यात्मक शाब्दिक मान के साथ व्याख्या करेगा 24(आधार 10 में)। हालांकि, सख्त मोड एक त्रुटि फेंक देगा।
क्षेत्र
ऐतिहासिक रूप से, जावास्क्रिप्ट को लेकर भ्रम हो गया है कि कार्य कैसे किए जाते हैं। कभी-कभी वे सांख्यिकीय रूप से स्कोप किए गए लगते हैं, लेकिन कुछ विशेषताएं उन्हें ऐसा व्यवहार करती हैं जैसे वे गतिशील रूप से स्कूप किए गए हों। यह भ्रामक है, कार्यक्रमों को पढ़ने और समझने में मुश्किल बनाता है। गलतफहमी कीड़े का कारण बनती है। यह प्रदर्शन के लिए भी एक समस्या है। स्टेटिक स्कोपिंग कंपाइलिंग टाइम पर वैरिएबल बाइंडिंग की अनुमति देता है, लेकिन डायनेमिक स्कोप की आवश्यकता का अर्थ है कि बाइंडिंग को रनटाइम के लिए स्थगित किया जाना चाहिए, जो एक महत्वपूर्ण प्रदर्शन पेनल्टी के साथ आता है।
सख्त मोड के लिए आवश्यक है कि सभी वैरिएबल बाइंडिंग को स्टैटिकली किया जाए। इसका मतलब है कि पहले से बाध्यकारी डायनामिक फीचर्स को समाप्त या संशोधित किया जाना चाहिए। विशेष रूप से, बयान के साथ समाप्त कर दिया जाता है, और इसके कॉलर के वातावरण के साथ छेड़छाड़ करने के लिए eval फ़ंक्शन की क्षमता गंभीर रूप से प्रतिबंधित है।
सख्त कोड के लाभों में से एक यह है कि
इसे संसाधित करते समय YUI कंप्रेसर जैसे उपकरण बेहतर काम कर सकते हैं।
वैश्विक चर
जावास्क्रिप्ट ने वैश्विक चर का अनुमान लगाया है। यदि आप स्पष्ट रूप से एक चर घोषित नहीं करते हैं, तो आपके लिए एक वैश्विक चर अनुमानित है। यह शुरुआती लोगों के लिए प्रोग्रामिंग को आसान बनाता है क्योंकि वे अपने कुछ बुनियादी हाउसकीपिंग कामों की उपेक्षा कर सकते हैं। लेकिन यह बड़े कार्यक्रमों के प्रबंधन को अधिक कठिन बना देता है और यह विश्वसनीयता को काफी कम कर देता है। इसलिए सख्त मोड में, निहित वैश्विक चर अब नहीं बनाए जाते हैं। आपको स्पष्ट रूप से अपने सभी चर घोषित करने चाहिए।
वैश्विक रिसाव
ऐसी कई स्थितियाँ हैं, जो this
वैश्विक वस्तु के लिए बाध्य हो सकती हैं । उदाहरण के लिए, यदि आप newकंस्ट्रक्टर फ़ंक्शन को कॉल करते समय उपसर्ग प्रदान करना भूल जाते हैं , तो कंस्ट्रक्टर thisवैश्विक ऑब्जेक्ट के लिए अप्रत्याशित रूप से बाध्य हो जाएगा, इसलिए एक नई ऑब्जेक्ट को इनिशियलाइज़ करने के बजाय, यह चुपचाप वैश्विक चर के साथ छेड़छाड़ करेगा। इन स्थितियों में, सख्त मोड बजाय बाध्य होगा thisकरने के लिए undefinedहै, जो निर्माता का कारण इजाजत दी त्रुटि और भी जल्दी पता लगाया जा बजाय एक अपवाद फेंकने के लिए, होगा।
शोरगुल की विफलता
जावास्क्रिप्ट में हमेशा केवल-पढ़ने के लिए गुण होते हैं, लेकिन जब तक कि ES5 के Object.createProperty
फ़ंक्शन ने उस क्षमता को उजागर नहीं किया, तब तक आप उन्हें स्वयं नहीं बना सकते । यदि आपने एक रीड-ओनली प्रॉपर्टी के लिए एक मान असाइन करने का प्रयास किया, तो यह चुपचाप विफल हो जाएगा। असाइनमेंट से प्रॉपर्टी की वैल्यू नहीं बदलेगी, लेकिन आपका प्रोग्राम वैसे ही आगे बढ़ेगा। यह एक अखंडता खतरा है जो कार्यक्रमों को असंगत स्थिति में जाने का कारण बन सकता है। सख्त मोड में, केवल-पढ़ने के लिए गुण बदलने का प्रयास अपवाद छोड़ देगा।
अष्टभुजाकार
मशीन पर मशीन-स्तर की प्रोग्रामिंग करते समय ऑक्टल (या बेस 8) संख्याओं का प्रतिनिधित्व बेहद उपयोगी था, जिनके शब्द आकार कई थे। सीडीसी 6600 मेनफ्रेम के साथ काम करते समय आपको ऑक्टल की आवश्यकता होती थी, जिसका शब्द आकार 60 बिट्स था। यदि आप अष्टक पढ़ सकते हैं, तो आप एक शब्द को 20 अंकों के रूप में देख सकते हैं। दो अंकों ने ऑप कोड का प्रतिनिधित्व किया, और एक अंक ने 8 रजिस्टरों में से एक की पहचान की। मशीन कोड से उच्च स्तर की भाषाओं में धीमी गति से संक्रमण के दौरान, प्रोग्रामिंग भाषाओं में ऑक्टल फॉर्म प्रदान करने के लिए उपयोगी माना गया था।
सी में, ऑक्टेलस का एक अत्यंत दुर्भाग्यपूर्ण प्रतिनिधित्व चुना गया था: अग्रणी शून्य। तो सी में, 010064 का अर्थ है, 100 नहीं, और 08एक त्रुटि है, 8. नहीं। इससे भी अधिक दुर्भाग्य से, इस अभिग्रह को जावास्क्रिप्ट सहित लगभग सभी आधुनिक भाषाओं में कॉपी किया गया है, जहां इसका उपयोग केवल त्रुटियों को बनाने के लिए किया जाता है। इसका कोई अन्य उद्देश्य नहीं है। इसलिए सख्त मोड में, ऑक्टल फॉर्म की अनुमति नहीं है।
Et cetera
तर्कों छद्म सरणी ES5 में थोड़ा और सरणी-जैसा हो जाता है। सख्त मोड में, यह अपने को खो देता है calleeऔर caller
गुण। यह argumentsबहुत सारे गोपनीय संदर्भ दिए बिना आपके अविश्वास कोड को पारित करना संभव बनाता है । साथ ही, argumentsफ़ंक्शन की
संपत्ति समाप्त हो जाती है।
सख्त मोड में, फ़ंक्शन शाब्दिक में डुप्लिकेट कुंजियाँ एक सिंटैक्स त्रुटि उत्पन्न करेंगी। एक फ़ंक्शन में एक ही नाम के दो पैरामीटर नहीं हो सकते। एक फ़ंक्शन के एक पैरामीटर के समान नाम के साथ एक चर नहीं हो सकता है। एक फ़ंक्शन deleteअपने स्वयं के चर नहीं कर सकता । deleteगैर-कॉन्फ़िगर करने योग्य संपत्ति का प्रयास
अब एक अपवाद फेंकता है। आदिम मान निहित नहीं हैं।
ECMAScript 5 आरक्षित शब्दों की एक सूची जोड़ता है। यदि आप उन्हें चर या तर्क के रूप में उपयोग करते हैं, तो सख्त मोड एक त्रुटि फेंक देगा। आरक्षित शब्द हैं: