2015-10-21 4 views
5

मुझे पता है let ब्लॉक स्कोप स्थानीय चर घोषित करना है, लेकिन यह रीडक्लेरेशन का समर्थन क्यों नहीं करता है और var की तरह उछालता है?क्यों बयान var से इतना अलग व्यवहार करेगा?

इस सीमा का डिजाइन उद्देश्य क्या है?

(function(){ 
    'use strict'; 
    alert(a);  // undefined 
    var a; 
})(); 

(function(){ 
    'use strict'; 
    alert(a);  // error 
    let a; 
})(); 

(function(){ 
    'use strict'; 
    var a; 
    var a; 
    alert(a);  // undefined 
})(); 

(function(){ 
    'use strict'; 
    let a; 
    let a;   // error 
    alert(a); 
})(); 
+1

@ user2190986 लेकिन यह स्पष्ट है कि 'चलो' जावास्क्रिप्ट – Rufus

+0

में स्थिरांक घोषित नहीं करता है @ user2190986 'const' का उपयोग स्थिरांक घोषित करने के लिए किया जाता है। – Alastair

+1

'चलो घोषणाएं ** ** ** फंसे हुए हैं। लेकिन 'var' घोषणाओं के विपरीत वेरिएबल को ब्लॉक की शुरुआत में 'अपरिभाषित' के साथ प्रारंभ नहीं किया जाता है। – zeroflagL

उत्तर

8

विचार के लिए एक उपकरण है कि और अधिक स्पष्ट और मूल var से ज्यादा सख्त है बनाने के लिए है।

alert(a); // Where does a come from? Why does this not throw? 
/* 1000 lines later, or even in an entirely different file */ 
var a; 

इसके अलावा, if बयान में एक ही गुंजाइश पर एक ही चर के लिए 5 var घोषणाओं, कुछ के साथ कोड की कल्पना, में कुछ:

एक मानव के रूप में, निम्नलिखित मान्य JavaScript लेकिन लगभग असंभव को समझने के लिए है for एस। पहला कौन सा है? क्या मूल्य बनने का अंत होगा?

विचार bad parts of var में से कुछ को ठीक करना था।

1

इसी कारण से किसी भी प्रोग्रामिंग भाषा में कोई सख्त ऑपरेटर दिखाई देता है - पैर में खुद को शूट करने के तरीकों की संख्या सीमित करने के लिए। ओल्ड-स्कूल जावास्क्रिप्ट सिर्फ उन लोगों से भरा हुआ है।

ध्यान दें कि आप एक ब्लॉक स्थानीय क्षेत्र के लिए 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 का भी उपयोग करता है। कोई वास्तविक वैध उपयोग नहीं है, और फिर भी कई विफलता मोड हैं - यह केवल एक भयानक भाषा सुविधा है।सरल संकलक त्रुटि उन सभी विफलताओं को होने से रोकती है - और उनमें से कई विफलताओं को खोजने में बहुत मुश्किल हो सकती है, खासकर यदि "आंतरिक" ब्लॉक का उपयोग अक्सर नहीं किया जाता है।

संबंधित मुद्दे