javascript - ECMAScript 2015: लूप्स के लिए कास्ट




for-loop scope (2)

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

for (const e of a)

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

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

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


आपका दूसरा उदाहरण निश्चित रूप से काम नहीं करना चाहिए क्योंकि 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 कास्ट पूरी तरह से बंद है। केवल उस के लिए कास्ट को संशोधित करेगा।

ये मान्य हैं:

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 युक्ति पढ़ने के बाद फ़ायरफ़ॉक्स एक सिंटैक्सएयर देता है (हालाँकि मुझे यकीन है कि मोज़िला में चतुर लोग सही हैं), ऐसा लगता है कि यह एक अपवाद को बढ़ाने वाला है:

एक एन्वायरमेंट रिकॉर्ड में एक नया लेकिन अनइंस्टाल्यूटेड अपरिवर्तनीय बाइंडिंग बनाएँ। स्ट्रिंग मान N बाउंड नाम का पाठ है। यदि S सत्य है, तो इसे शुरू करने से पहले बाइंडिंग के मान को एक्सेस करने का प्रयास किया जाता है या इसे शुरू करने के बाद सेट किया जाता है, जो हमेशा उस बंधन को संदर्भित करने वाले संचालन के सख्त मोड सेटिंग की परवाह किए बिना हमेशा एक अपवाद फेंक देगा। एस एक वैकल्पिक पैरामीटर है जो झूठे को परिभाषित करता है।


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

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