दिलचस्प पोस्ट
स्काला में गतिशील मिक्सिन – क्या यह संभव है? क्या फोनगैप और कॉर्डोवा के आदेशों में कोई अंतर है? PHP में Stackoverflow API से मैं GZIP-ed प्रतिक्रिया कैसे पढ़ सकता / सकती हूं? जावा गुण वर्ग के बराबर गुण गुण फ़ाइल को .NET लोड और पार्स कर सकते हैं? रेलिंग वस्तु रिश्ते और JSON प्रतिपादन हेडर फाइलों को शामिल करते समय, पथ केस संवेदनशील होता है? ExecuteReader को एक खुला और उपलब्ध कनेक्शन की आवश्यकता है। कनेक्शन का वर्तमान स्थिति कनेक्ट हो रहा है निकटतम मान ढूँढना और पायथन में सरणी के सूचक को वापस करना उसी कुंजी के तहत कई मानों के साथ हैशमैप एक वैध फ़ाइल नाम में एक स्ट्रिंग चालू करें? मैं 'ImportError कैसे ठीक कर सकता हूं: नाम अपूर्ण रीड आयात नहीं कर सकता'? << का उपयोग करते समय ओस्ट्रीम में वैज्ञानिक संकेतन को रोकें लिनक्स: क्या आउटपुट के साथ गर्तिका से कोई पढ़ा है या फिर recv? वाइल्डफ़ी को स्थिर सामग्री (जैसे चित्रों) के लिए कैसे कॉन्फ़िगर करें? आर में सफेद स्थान के पहले वर्ण स्ट्रिंग निकालने के लिए gsub का उपयोग करना

क्या ES6 में चलो या कॉन्स्ट नहीं फहराए गए के साथ घोषित चर?

मैं थोड़ी देर के लिए ईएस 6 के साथ खेल रहा था और मैंने देखा कि जब var साथ घोषित वेरिएबल्स को उम्मीद के मुताबिक फहराया जाता है …

 console.log(typeof name); // undefined var name = "John"; 

let या const साथ घोषित चर को उड़ाते हुए कुछ समस्याएं हैं:

 console.log(typeof name); // ReferenceError let name = "John"; 

तथा

 console.log(typeof name); // ReferenceError const name = "John"; 

क्या इसका मतलब यह है कि let या const साथ घोषित चर को फहराया नहीं गया है? सचमुच यहाँ क्या हो रहा है? क्या इस मामले में let और const बीच कोई अंतर है?

Solutions Collecting From Web of "क्या ES6 में चलो या कॉन्स्ट नहीं फहराए गए के साथ घोषित चर?"

@thefourtheye कह रही है कि इन चर को घोषित किए जाने से पहले तक नहीं पहुंचा जा सकता है । हालांकि, यह उस से थोड़ा और अधिक जटिल है

let या const नहीं फहराया के साथ घोषित चर रहे हैं? सचमुच यहाँ क्या हो रहा है?

जावास्क्रिप्ट में सभी घोषणाओं ( var , let , const , function , function* , class ) "hoisted" हैं इसका मतलब यह है कि यदि एक क्षेत्र को एक क्षेत्र में घोषित किया गया है, तो उस क्षेत्र में पहचानकर्ता हमेशा विशिष्ट चर का संदर्भ देगा:

 x = "global"; // function scope: (function() { x; // not "global" var/let/… x; }()); // block scope (not for `var`s): { x; // not "global" let/const/… x; } 

यह कार्य और ब्लॉक स्कोप 1 दोनों के लिए सच है I

var / function / function* declarations और let / const / class declarations के बीच अंतर initialisation है
पूर्व undefined या (जनरेटर) फ़ंक्शंस के साथ undefined किया जाता है जब बाध्यता दायरे के शीर्ष पर बनाई जाती है मौलिक घोषित वेरिएबल्स अनिर्धारित नहीं रह गए हैं। इसका मतलब यह है कि जब आप इसे एक्सेस करने का प्रयास करते हैं तो एक ReferenceError अपवाद फेंका जाता है यह केवल प्रारंभ होगा जब let / const / class स्टेटमेंट का मूल्यांकन किया जाता है, सब कुछ (ऊपर) से पहले जिसे अस्थायी मृत क्षेत्र कहा जाता है

 x = y = "global"; (function() { x; // undefined y; // Reference error: y is not defined var x = "local"; let y = "local"; }()); 

सूचना दें कि एक let y; स्टेटमेंट अनिवार्य रूप से चर को प्रारंभ करता है जैसे let y = undefined; होगा।

अस्थायी मृत क्षेत्र एक वाक्य रचनात्मक स्थान नहीं है, बल्कि वेरिएबल (क्षेत्र) निर्माण और आरंभिकरण के बीच का समय है। यह घोषणा के ऊपर कोड में चर को संदर्भित करने के लिए एक त्रुटि नहीं है, जब तक कि कोड निष्पादित नहीं होता है (उदाहरण के लिए फ़ंक्शन बॉडी या सिर्फ मरे हुए कोड), और यदि आप आरम्भिकरण से पहले चर का उपयोग करते हैं, तो यह एक अपवाद फेंकता होगा कोड घोषणापत्र से नीचे है (उदाहरण के लिए एक फहराया कार्य घोषणा जिसमें इसे बहुत जल्दी कहा जाता है)

क्या इस मामले में let और const बीच कोई अंतर है?

नहीं, वे उसी तरह काम करते हैं जहां तक ​​उत्थापन माना जाता है। उन दोनों के बीच एकमात्र अंतर यह है कि एक चींटी चींटी ही होनी चाहिए और घोषणा के शुरुआती भाग में केवल एक ही आवंटित की जा सकती है ( const one = 1; दोनों const one; और बाद में one = 2 तरह पुन: असाइनमेंट अमान्य हैं)।

1: var घोषणाएं अभी भी केवल फ़ंक्शन स्तर पर काम कर रही हैं, ज़ाहिर है

ईसीएमएस्क्रिप्ट 6 (ईसीएमएस्क्रिप्ट 2015) के विनिर्देशन का हवाला देते हुए, घोषित करें और घोषणाएं अनुभाग,

वेरिएबल्स बनाये जाते हैं, जब उनके वाले लेक्सिकल एन्वायरमेंट का तत्त्व होता है, लेकिन वेरिएबल के लेक्सिकल बाइंडिंग का मूल्यांकन नहीं किए जाने तक किसी भी तरह का उपयोग नहीं किया जा सकता है

तो, अपने प्रश्न का उत्तर देने के लिए, हां, let और const , लेकिन वास्तविक घोषणा के समय क्रमशः पर मूल्यांकन किए जाने से पहले आप उनका उपयोग नहीं कर सकते।

ES6 परिचय Let चर है जो block level scoping साथ आता है। ES5 तक हमारे पास block level scoping नहीं था, इसलिए एक ब्लॉक के अंदर घोषित किए गए वेरिएबल्स हमेशा hoisted को काम करने के लिए hoisted जाते हैं।

मूल रूप से Scope अर्थ है कि आपके प्रोग्राम में आपके चर कहां दिखाई दे रहे हैं, जो यह निर्धारित करता है कि आपको अपने द्वारा घोषित वेरिएबल का उपयोग करने की अनुमति कहाँ है। ES5 हमारे पास global scope,function scope and try/catch scope , ES6 साथ हम चलो का उपयोग करके ब्लॉक स्तर की जानकारी भी प्राप्त करते हैं।

  • जब आप var कीवर्ड के साथ एक वैरिएबल को परिभाषित करते हैं, तो यह परिभाषित होने वाले समय से पूरे फ़ंक्शन को ज्ञात होता है।
  • जब आप एक बयान को परिभाषित करते हैं let इसे केवल ब्लॉक में परिभाषित किया जाता है।

      function doSomething(arr){ //i is known here but undefined //j is not known here console.log(i); console.log(j); for(var i=0; i<arr.length; i++){ //i is known here } //i is known here //j is not known here console.log(i); console.log(j); for(let j=0; j<arr.length; j++){ //j is known here } //i is known here //j is not known here console.log(i); console.log(j); } doSomething(["Thalaivar", "Vinoth", "Kabali", "Dinesh"]); 

यदि आप कोड चलाते हैं, तो आप देख सकते हैं कि चर j केवल loop में जाना जाता है और पहले और बाद में नहीं। फिर भी, हमारे चर i को entire function से उस पल से जाना जाता है जो इसे आगे परिभाषित किया जाता है।

यह एक नया सैद्धांतिक वातावरण बनाता है और पुराने संदर्भ को रखने के बजाय नए मूल्य को बांधने के साथ-साथ एक और महान लाभ है

 for(var i=1; i<6; i++){ setTimeout(function(){ console.log(i); },1000) } for(let i=1; i<6; i++){ setTimeout(function(){ console.log(i); },1000) } 

लूप के for सबसे पहले यह अंतिम मान प्रिंट करता है, साथ में यह एक नया दायरा बनाता है और हमें 1, 2, 3, 4, 5 प्रिंट करने वाले ताजा मूल्यों को बाध्य करता है।

constants लिए आ रहा है, यह मूल रूप से काम let , केवल अंतर यह है कि उनका मूल्य बदला नहीं जा सकता। स्थिरांक में उत्परिवर्तन की अनुमति है लेकिन पुन: असाइनमेंट की अनुमति नहीं है।

 const foo = {}; foo.bar = 42; console.log(foo.bar); //works const name = [] name.push("Vinoth"); console.log(name); //works const age = 100; age = 20; //Throws Uncaught TypeError: Assignment to constant variable. console.log(age); 

अगर कोई निरंतर किसी object को संदर्भित करता है, तो वह हमेशा object संदर्भ देगा, लेकिन object को बदला जा सकता है (यदि यह अयोग्य है)। यदि आप एक अपरिवर्तनीय object , तो आप object उपयोग कर सकते Object.freeze([])