javascript ईसीएमएस्क्रिप्ट 2015: लूप के लिए कॉन्स




for-loop scope (3)

नीचे दिए गए दो (या न तो / दोनों) कोड टुकड़े एक पूर्ण ईसीएमएस्क्रिप्ट 2015 कार्यान्वयन में काम कर रहे हैं:

for (const e of a)

for (const i = 0; i < a.length; i += 1)

मेरी समझ से, पहला उदाहरण काम करना चाहिए क्योंकि प्रत्येक पुनरावृत्ति के लिए e प्रारंभ किया गया है। क्या यह दूसरे संस्करण में भी i लिए मामला नहीं होना चाहिए?

मैं उलझन में हूं क्योंकि मौजूदा कार्यान्वयन (बेबेल, आईई, फ़ायरफ़ॉक्स, क्रोम, ईएसलिंट) दो लूप वेरिएंट के विभिन्न व्यवहारों के साथ संगत होने का पूर्ण कार्यान्वयन नहीं करते हैं; मैं मानक में एक ठोस बिंदु भी नहीं ढूंढ पा रहा हूं, इसलिए इसकी सराहना की जाएगी।

https://code.i-harness.com


आपका दूसरा उदाहरण निश्चित रूप से काम नहीं करना चाहिए क्योंकि i एक बार घोषित किया जाता है और प्रत्येक पुनरावृत्ति पर नहीं, यह केवल एक कार्य है कि लूप की श्रेणी कैसे काम करती है।

आप इसे नियमित ब्राउज़र में आजमा सकते हैं:

for (var i = 0, otherVar = ""; i < [1,2,3,4].length; i += 1){
  console.log(otherVar)
  otherVar = "If otherVar was initialized on each iteration, then you would never read me.";
}

ऐसा नहीं है कि लूप के for पूरी तरह से const है। केवल इसके for कॉन्स संशोधित होगा।

ये मान्य हैं:

for(const i = 0;;){ break } 
for(const i = 0; i < 10;){ break; } 

ये अमान्य हैं:

for(const i = 0;;){ ++i; break; } 
for(const i = 0;;++i){ if(i > 0) break; }

मुझे यकीन नहीं है कि क्यों फ़ायरफ़ॉक्स ES2015 spec पढ़ने के बाद एक सिंटेक्स त्रुटि देता है (हालांकि मुझे यकीन है कि मोज़िला में चालाक लोक सही हैं), ऐसा लगता है कि यह अपवाद उठाना है:

पर्यावरण रिकॉर्ड में एक नया लेकिन अनियमित अपरिवर्तनीय बाध्यकारी बनाएं। स्ट्रिंग मान एन बाध्य नाम का पाठ है। यदि एस सत्य है तो बाध्यकारी के मूल्य को प्रारंभ करने से पहले इसे शुरू करने या इसे शुरू करने के बाद सेट करने का प्रयास हमेशा बाधा डालने वाले ऑपरेशन की सख्त मोड सेटिंग के बावजूद अपवाद फेंक देगा। एस एक वैकल्पिक पैरामीटर है जो गलत पर डिफ़ॉल्ट है।


मैं इस बार spec उद्धृत नहीं करेंगे, क्योंकि मुझे लगता है कि उदाहरण के साथ क्या होता है यह समझना आसान है।

for (const e of a) …

मूल रूप से बराबर है

{
    const __it = a[Symbol.iterator]();
    let __res;
    while (__res = __it.next() && !__res.done) {
        const e = __res.value;
        …
    }
}

सादगी के लिए मैंने अनदेखा किया है कि a अभिव्यक्ति के लिए e के साथ एक टीडीजेड है, और विभिन्न __it.return() / __it.throw(e) मामले में कॉल लूप समय से बाहर निकलता है (शरीर में break या throw break है)।

for (const i = 0; i < a.length; i += 1) …

मूल रूप से बराबर है

{
    const i = 0;
    while (i < a.length) {
        …
        i += 1;
    }
}

इसके विपरीत , प्रत्येक लूप पुनरावृत्ति में लूप में एक const घोषणा को पुन: प्राप्त नहीं किया जाता है (और प्रारंभकर्ता को वैसे भी फिर से निष्पादित नहीं किया जाता है)। जब तक आप पहली पुनरावृत्ति में break नहीं लेते, तो आपका i += यहां फेंक देगा।


लूप के लिए निम्न कार्य करता है:

for (const e of a)

ES6 विनिर्देश इस प्रकार वर्णन करता है:

ForDeclaration: LetOrConst ForBinding

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

लूप के लिए अनिवार्य काम नहीं करेगा:

for (const i = 0; i < a.length; i += 1)

ऐसा इसलिए है क्योंकि लूप बॉडी निष्पादित होने से पहले घोषणापत्र का मूल्यांकन किया जाता है।

http://www.ecma-international.org/ecma-262/6.0/index.html#sec-for-statement-runtime-semantics-labelledevaluation





ecmascript-6