2016-06-20 6 views
173

मुझे समझ में आता है कि var वह नाम क्यों लेता है - यह परिवर्तनीय है, const - यह स्थिर है, लेकिन let के नाम के पीछे क्या अर्थ है, जो मौजूदा ब्लॉक पर स्कॉप्स करता है? होने दो?जावास्क्रिप्ट में ब्लॉक-स्कोप्ड वैरिएबल घोषणाओं के लिए 'चलो' नाम क्यों चुना गया था?

+4

[बेसिक] (https://en.wikipedia.org/wiki/BASIC), 1 9 62 में आविष्कार किया गया, 'एलईटी' का उपयोग किया गया। पहले भाषा के उदाहरण हो सकते हैं। –

उत्तर

207

Let एक गणितीय बयान है कि योजना और बेसिक जैसे प्रारंभिक प्रोग्रामिंग भाषाओं द्वारा अपनाया गया था कि "मेरे पालतू एक कुत्ता होने दो"। वेरिएबल्स को निम्न स्तर की इकाइयों को अवशोषण के उच्च स्तर के लिए उपयुक्त नहीं माना जाता है, इस प्रकार कई भाषा डिजाइनरों की इच्छा क्लोजर, एफ #, स्कैला जैसी समान लेकिन अधिक शक्तिशाली अवधारणाओं को पेश करने की इच्छा है, जहां let का अर्थ एक मान हो सकता है, या वेरिएबल हो सकता है असाइन किया गया, लेकिन नहीं बदला, जो बदले में कंपाइलर को अधिक प्रोग्रामिंग त्रुटियों को पकड़ने और कोड को बेहतर अनुकूलित करने देता है। जावास्क्रिप्ट की शुरुआत से var था, इसलिए उन्हें केवल एक और कीवर्ड की आवश्यकता थी, और let का उपयोग पारंपरिक रूप से var जितना संभव हो सके पारंपरिक कीवर्ड के रूप में किया जाता है, हालांकि जावास्क्रिप्ट let में ब्लॉक स्कोप स्थानीय चर बनाता है।

+3

अच्छी तरह से समझाया। – gani

+25

और आधिकारिक मोज़िला दस्तावेज़ीकरण पृष्ठ इस प्रश्न के लिए इस पृष्ठ को उद्धृत करता है https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let – SarathChandra

+2

यह भी अच्छा है कि 'लेन (' var ') == = लेन ('चलो') ', जिसका अर्थ है कि आपकी घोषणाएं आपके संपादक में किसी भी तरह से अच्छी तरह से बढ़ती हैं।मुझे यह सुझाव देने के लिए अभी तक कुछ भी नहीं मिला है कि यह जानबूझकर था, लेकिन यह या तो हो सकता है) दृष्टि से प्रसन्न और अधिक पठनीय, या बी) अगर आप दो मिश्रण करते हैं तो डीबग करने के लिए बहुत परेशान करना (जो कि किसी भी तरह के बुरे विचार की तरह लगता है, लेकिन मैं ' मैंने इसे देखा है)। – brichins

49

मुझे लगता है कि यह गणितीय परंपरा का पालन करता है। गणित में, अक्सर यह कहा जाता है कि "एक्स को मनमाना वास्तविक संख्या दें" या ऐसा ही।

29

यह ठीक है var एक दायरे के अंतर के साथ करता है। अब यह var नाम नहीं ले सकता है क्योंकि यह पहले ही लिया जा चुका है।

तो ऐसा लगता है कि उसने अगले सबसे अच्छे नाम को लिया है जो एक दिलचस्प अंग्रेजी भाषा निर्माण में अर्थपूर्ण है।

let myPet = 'dog'; 

अंग्रेजी में यह कहते हैं

+3

जबकि उत्पत्ति की उत्पत्ति भाषाई और गणितीय हो सकती है, लेकिन निकट-घर संदर्भ संदर्भ निस्संदेह बीएएसआईसी प्रोग्रामिंग भाषा के सभी संस्करणों में एलईटी स्टेटमेंट है, एक ऐसा है कि ईएस 6 के कई लेखकों ने सीखना शुरू कर दिया होगा यदि वे हैं 40 से अधिक यो। –

+3

@wide_eyed_pupil बस FYI: एक 40 से अधिक (हालांकि ईएस 6 का लेखक नहीं) जो बेसिक पर बड़ा हुआ, कोई भी समुदाय मैं सामान्य अभ्यास में उपयोग किए गए एलईटी के साथ शामिल नहीं था; हमने अभी चर को असाइन किया है, क्योंकि पाइथन अब करता है (उदाहरण के लिए 'ए $ = "हैलो वर्ल्ड" ') शामिल दुभाषियों में रॉकवेल एआईएम 65 बेसिक, अटारी बेसिक, सीपी/एम, एपल्सॉफ्ट बेसिक, और यहां तक ​​कि बास्कॉम, एमएस बेसिक पर एमबीएएसआईसीआई 5 शामिल थे। सीपी/एम पर संकलक। वैक्स बेसिक में एलईटी था, लेकिन मुझे इसकी आवश्यकता नहीं थी, जैसा कि मुझे याद है। मेमोरी तब तंग थी, और प्रति पाठ कार्यक्रम पाठ के 3 या 4 अतिरिक्त पात्रों ने विशेष रूप से "बड़े" कार्यक्रमों में एक अंतर बनाया। –

+0

@ पीटर हॉल यह दिलचस्प है, मैंने डिजिटल सीपीयू से जुड़े पेंसिल चिह्नित कार्ड पर अपना पहला कोडिंग किया, फिर स्कूल में पुराने आदमी की शोध प्रयोगशाला और डिजिटल पीडीपी 8 पर मेनफ्रेम। कभी-कभी लोगों ने कथन का उपयोग किए बिना एलईटी का उपयोग कभी नहीं देखा, किताबों में मैंने नहीं पढ़ा। मुझे लगता है कि मुझे फोरट्रान और पास्कल में कोड करने के लिए प्रोत्साहित किया गया था जैसे ही मुझे कोई अच्छा मिला, मूलभूत जितना बुरा था, मेरे द्वारा उपयोग किए जाने वाले संस्करणों में GOSUB (यानी पुन: प्रयोज्य फ़ंक्शंस) भी नहीं था। –

8

सबसे अधिक संभावना है कि यह सबसे बेवकूफ पसंद था। न केवल बोलना आसान है, बल्कि समझने के लिए सहज है। कुछ var से भी अधिक तर्क दे सकते हैं।

लेकिन मुझे लगता है कि इसके लिए थोड़ा और इतिहास है।

विकिपीडिया से:

दाना स्कॉट की LCF भाषा आधुनिक कार्यात्मक भाषाओं में लैम्ब्डा पथरी के विकास में एक चरण था। इस भाषा ने लेट एक्सप्रेशन पेश किया, जो उस समय से अधिकांश कार्यात्मक भाषाओं में दिखाई दिया है।

एएलजीओएल और पास्कल जैसी राज्य-पूर्ण अनिवार्य भाषाएं ब्लॉक संरचनाओं में कार्यों के प्रतिबंधित दायरे को लागू करने के लिए अनिवार्य रूप से एक अभिव्यक्ति को लागू करती हैं।

मुझे विश्वास है कि यह जावास्क्रिप्ट में let के लिए भी एक प्रेरणा थी।

26

exebook's response को जोड़ना, कीवर्ड की गणित उपयोग जब जावास्क्रिप्ट/ES6 में इस्तेमाल भी अच्छी तरह से समाहित let की scoping निहितार्थ हैं।विशेष रूप से, निम्नलिखित ES6 कोड toPrint की ब्रेसिज़ में काम पर ध्यान नहीं देता और 'Hello World' का मूल्य बाहर प्रिंट बस के रूप में के रूप में औपचारिक रूप गणित (विशेष रूप से सबूत के लेखन) में इस्तेमाल

let toPrint = 'Hello World.'; 
{ 
    let toPrint = 'Goodbye World.'; 
} 
console.log(toPrint); // Prints 'Hello World' 

जाने इंगित करता है कि वर्तमान उदाहरण एक चर के केवल उस तार्किक विचार के दायरे के लिए मौजूद है। निम्नलिखित उदाहरण में, एक्स को नए विचार को दर्ज करने पर तुरंत एक नई पहचान प्राप्त होती है (आमतौर पर ये मुख्य विचार साबित करने के लिए आवश्यक अवधारणाएं हैं) और सब-सबूत के समापन पर तुरंत पुराने x पर वापस आती हैं। बेशक, कोडिंग के रूप में, इसे कुछ हद तक भ्रमित माना जाता है और इसलिए आमतौर पर अन्य चर के लिए एक अलग नाम चुनकर टाला जाता है।

चलो एक्स इतना और ऐसा हो ...

  सबूत सामान

  नए आइडिया {कुछ और होने दो एक्स ... कुछ साबित} निष्कर्ष नए आइडिया

  पुराने x

के साथ मुख्य विचार साबित करें
+4

मुझे लगता है कि यह वास्तव में उपयोगी है। स्वीकृत उत्तर लगभग थोड़ा भ्रामक है, क्योंकि यह उस मूल्य के बारे में बात करता है जो बदलने में सक्षम नहीं है, जो कि 'चलो' बिल्कुल नहीं है। 'चलो' गुंजाइश के बारे में सब कुछ है। – jinglesthula

0

चलिए एक अधिक तत्काल ब्लॉक स्तर सीमित दायरे का उपयोग करते हैं जबकि var आमतौर पर कार्यक्षेत्र या वैश्विक दायरा है।

ऐसा लगता है कि चलिए सबसे अधिक संभावना चुना गया था क्योंकि यह कई अन्य भाषाओं में पाया जाता है ताकि वे बेसिक, और कई अन्य चर को परिभाषित कर सकें।

1

वैरिएबल द्वारा घोषित वेरिएबल्स को उनके दायरे के रूप में परिभाषित किया गया है, साथ ही किसी भी निहित उप-ब्लॉक में। इस तरह, var var की तरह काम करता है। मुख्य अंतर यह है कि एक var चर का दायरा पूरे संलग्न कार्य है। नीचे कुछ उदाहरण देखें।

function varTest() { 
    var x = 1; 
    if (true) { 
    var x = 2; // same variable! 
    console.log(x); // 2 
    } 
    console.log(x); // 2 
} 

function letTest() { 
    let x = 1; 
    if (true) { 
    let x = 2; // different variable 
    console.log(x); // 2 
    } 
    console.log(x); // 1 
} 
संबंधित मुद्दे