इसलिए मैंने देखा कि मुझे for लूप के अंदर let का उपयोग करना है, और const का उपयोग नहीं कर सकता। हालांकि, मैंने पाया कि मैं const का उपयोग for-in और for-of कंस्ट्रक्शंस (नीचे कोड) के अंदर कर सकता हूं। सहज रूप से मैं इसे युक्तिसंगत बना सकता हूं क्योंकि for लूप को अलग तरह से लागू किया गया है/अधिक आदिम है, जबकि अन्य लूप के लिए desugar का निर्माण करता है जहां लूप के शीर्ष पर पुनरावृत्त चर को असाइन किया गया है।

// Doesn't work
for (const i = 0; i < 3; i++) {
  console.log(i);
}

// Works
for (let i = 0; i < 3; i++) {
  console.log(i);
}

// Works
const object2 = ['a', 'b', 'c'];
for (const v of object2) {
  console.log(v);
}

// Works
const object3 = {
  a: 'a',
  b: 'b',
  c: 'c',
};
for (const v in object3) {
  console.log(v);
}

इसके बारे में मोज़िला एमडीएन पर मुझे केवल एक ही चीज़ मिली के लिए लूप पृष्ठ:

यह अभिव्यक्ति वैकल्पिक रूप से var कीवर्ड के साथ नए चर घोषित कर सकती है। ये चर लूप के लिए स्थानीय नहीं हैं, अर्थात वे उसी दायरे में हैं जिसमें लूप है। इस अभिव्यक्ति के परिणाम को छोड़ दिया जाता है।

जो गलत भी लगता है, क्योंकि अगर हम i के लिए let का उपयोग करते हैं तो i अब for लूप (जो अन्य भाषाओं के साथ संगत है) के दायरे में नहीं है।

for (let i = 0; i < 3; i++) {
  console.log(i);
}
// Doesn't work as expected
console.log(i);

मेरा सवाल यह है कि क्या यह व्यवहार कहीं न कहीं कल्पना में अपेक्षित और परिभाषित है? एमडीएन इस बारे में ज्यादा कुछ नहीं कहता है।

3
dualscyther 30 मार्च 2018, 14:04

3 जवाब

आपके पहले प्रश्न का उत्तर @NullDev द्वारा दिया गया है, इसलिए मैं दूसरे प्रश्न पर जा रहा हूँ:

यह अभिव्यक्ति वैकल्पिक रूप से var कीवर्ड के साथ नए चर घोषित कर सकती है। ये चर लूप के लिए स्थानीय नहीं हैं, अर्थात वे उसी दायरे में हैं जिसमें लूप है। इस अभिव्यक्ति के परिणाम को छोड़ दिया जाता है।

"ये चर लूप के लिए स्थानीय नहीं हैं" का अर्थ है var कीवर्ड द्वारा बनाया गया काउंटर। यदि आप let का उपयोग करते हैं तो काउंटर का दायरा केवल लूप के लिए है। यह एक और अपेक्षित व्यवहार है क्योंकि var का दायरा व्यापक है। और हाँ, दस्तावेज़ीकरण थोड़ा अस्पष्ट है।

1
Huy Vo 30 मार्च 2018, 11:19

कल्पना

ForDeclaration: LetOrConst ForBinding

let और const को इन-इन और फॉर-ऑफ़ स्टेटमेंट में अनुमति है।

साथ ही, कल्पना

ForBinding के बाउंडनाम के प्रत्येक तत्व के नाम के लिए

यह व्यंजक for (const v in object3) { प्रत्येक पुनरावृत्ति के लिए निष्पादित होता है और एक नया बंधन देता है

हालांकि, सरल फॉर-लूप के साथ - for (const i = 0; i < 3; i++) {, const i को केवल एक बार निष्पादित किया जाता है और इसलिए यह आपको फिर से -इसे एक मान असाइन करें

2
gurvinder372 30 मार्च 2018, 11:15

हाँ। यह वास्तव में अपेक्षित व्यवहार है।

const एक वैरिएबल को परिभाषित करता है, जैसा कि नाम से पता चलता है, स्थिर रहता है। इसका मतलब है कि एक कॉन्स का मान नहीं बदल सकता है।

अब आप अपने for लूप में जो करते हैं वह "i" को बढ़ा रहा है, जिसे एक स्थिरांक के रूप में परिभाषित किया गया था।

for (const i = 0; i < 3; i++ /* <- this doesn't work */ ) {
    console.log(i);
}

for .. in या for .. of के साथ हालांकि, आप केवल चर को बांधते हैं।

दूसरे शब्दों में: for .. in/off के साथ, वेरिएबल को लूप के निष्पादन से पहले एक बार असाइन किया जाता है, न कि प्रत्येक पुनरावृत्ति पर। इसलिए const का वास्तव में उपयोग किया जा सकता है।

संदर्भ के लिए:

ForDeclaration: LetOrConst ForBinding

http://www.ecma-international.org/ecma-262/6.0/index.html#sec-for-in-and-for-of-statements-static-semantics-boundnames

3
NullDev 30 मार्च 2018, 11:13