इसी कारण से किसी भी प्रोग्रामिंग भाषा में कोई सख्त ऑपरेटर दिखाई देता है - पैर में खुद को शूट करने के तरीकों की संख्या सीमित करने के लिए। ओल्ड-स्कूल जावास्क्रिप्ट सिर्फ उन लोगों से भरा हुआ है।
ध्यान दें कि आप एक ब्लॉक स्थानीय क्षेत्र के लिए let
उपयोग कर सकते हैं:
while (i < 5)
{
let a = 42;
i++;
}
हालांकि पाश एक दो बार चलाता है, a
हमेशा ठीक से प्रारंभ किया गया है।
अब, यदि आपके पास उच्च दायरे में एक और चर है तो क्या होगा?
let a = 42;
while (i < 5)
{
let a = 10;
// What is the value of a here?
i++;
}
// And here?
यहां अस्पष्टता का एक निश्चित स्तर है - और प्रोग्रामिंग भाषा में अस्पष्टता एक बुरी विशेषता है। यह गैर-ब्लॉक-स्कोप्ड var
के साथ कोई समस्या नहीं है - इसमें से कई के अपने मुद्दे हैं, और लोग इसे हर समय दुरुपयोग करते हैं, लेकिन कम से कम यह स्पष्ट है कि var
कभी ब्लॉक-स्कॉप्ड नहीं है। और फिर भी - लोग इसका उपयोग करते हैं जैसे कि ब्लॉक-स्कॉप्ड थे।
इस पागलपन को ठीक करने का एकमात्र तरीका भाषा को थोड़ा कठोर बनाना है। क्या इसका वास्तव में मतलब है कि आप किसी भी सुविधा को खो देते हैं? नहीं। परिवर्तनीय छाया var
के साथ एक बुरा विचार था, और यह अभी भी let
(और जैसा कि मेरा उदाहरण दिखाता है, संभवतः बदतर) के साथ एक बुरा विचार होगा।
यह लंबे शॉट से नहीं, जावास्क्रिप्ट के लिए अद्वितीय नहीं है। उदाहरण के लिए, सी #:
int i = 0;
int i = 42; // Compiler error: A local variable named 'i' is already defined in this scope
क्यों? क्योंकि आपके पास स्पष्ट रूप से ने गलती की है। शायद आपने कहीं और कोड से एक टुकड़ा कॉपी किया है, और यह नहीं देखा है कि आपके पास पहले से ही i
नाम का एक और चर है। शायद आप भूल गए हैं कि आप किसी अन्य लूप के बीच में हैं, जो लूप वैरिएबल के रूप में i
का भी उपयोग करता है। कोई वास्तविक वैध उपयोग नहीं है, और फिर भी कई विफलता मोड हैं - यह केवल एक भयानक भाषा सुविधा है।सरल संकलक त्रुटि उन सभी विफलताओं को होने से रोकती है - और उनमें से कई विफलताओं को खोजने में बहुत मुश्किल हो सकती है, खासकर यदि "आंतरिक" ब्लॉक का उपयोग अक्सर नहीं किया जाता है।
@ user2190986 लेकिन यह स्पष्ट है कि 'चलो' जावास्क्रिप्ट – Rufus
में स्थिरांक घोषित नहीं करता है @ user2190986 'const' का उपयोग स्थिरांक घोषित करने के लिए किया जाता है। – Alastair
'चलो घोषणाएं ** ** ** फंसे हुए हैं। लेकिन 'var' घोषणाओं के विपरीत वेरिएबल को ब्लॉक की शुरुआत में 'अपरिभाषित' के साथ प्रारंभ नहीं किया जाता है। – zeroflagL