2011-01-19 20 views
10

मैं Google Closure Compiler की खोज कर रहा था, और एक बात मैंने देखा था कि यह while(true) को for(;;) में परिवर्तित करता है।लूप के लिए खाली - के लिए (;;)

दोनों ब्राउज़र लटका है, लेकिन क्यों खाली for पाश ही से बाहर तुरंत नष्ट नहीं होती है? इसका दूसरा भाग खाली है, और इसलिए झूठा है। क्या यह सच नहीं है कि जब दूसरा भाग झूठा है, for लूप स्टॉप और निष्पादन कोड के साथ जारी रहता है जो for लूप के बाद आता है?

कोई शायद इस के लिए एक स्पष्टीकरण दे सकते हैं?

+2

हो सकता है कि यह तेजी से है ... किसी को बेंचमार्क चाहिए उन्हें :) –

+2

खैर, यह छोटा होता है - कि क्या संकलक करता है: बस अपने कोड (यह वास्तव में एक महान उपकरण है) – pimvdb

उत्तर

20

नहीं, यह सच नहीं है।

देखें: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for

हालत

कोई व्यंजक प्रत्येक पाश यात्रा से पहले मूल्यांकन किया जाना। यदि यह अभिव्यक्ति सत्य पर मूल्यांकन करती है, कथन निष्पादित किया गया है। यह सशर्त परीक्षण वैकल्पिक है। तो छोड़ा जाता है, हालत हमेशा सच मूल्यांकन करता है। अभिव्यक्ति गलत का आकलन करते हैं, तो निष्पादन निर्माण के लिए निम्नलिखित पहली अभिव्यक्ति को छोड़ देता है।

मुझे शायद ईसीएमएस्क्रिप्ट संदर्भ के लिए एक लिंक देना चाहिए, लेकिन मुझे पूरा यकीन है कि यह कम या ज्यादा चीज़ बताता है।

+4

गुड लक को कम करने। मैं बस 'ईसीएमए -262 चश्मा] (http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf) के माध्यम से' for' loops के लिए चला गया और वे आम तौर पर अचूक हैं। उपरोक्त व्यवहार स्पष्ट रूप से अनिवार्य रूप से अनिवार्य होने के बजाय, spec में चरणों का पालन करने का एक परिणाम है। – Phrogz

+0

ओह ठीक है ... तो मुझे लगता है कि मोज़िला का संदर्भ और मेरा शब्द है कि ईसीएमएस्क्रिप्ट के सभी लोकप्रिय रूप इस तरह से व्यवहार करते हैं। : डी – Mchl

1

एक खाली मध्य भाग को true के रूप में व्याख्या किया जाना चाहिए, इसलिए यह झूठा नहीं है। सी और अन्य भाषाओं में इस तरह के लूप (जैसे सी #, जावा और इसी तरह) के साथ समान अर्थशास्त्र है। यह जावास्क्रिप्ट के लिए इसे बदलने के लिए एक असली जाल होगा।

+1

मुझे यह नहीं पता था। इसके अलावा मैं इसे बदलना नहीं चाहता हूं, मैं बस सोच रहा था। – pimvdb

+0

@pimvdb: मुझे यह भी समझा गया :) मैं बस यह इंगित करना चाहता था कि यह वास्तव में जावास्क्रिप्ट के निर्माता के लिए नहीं था। उसे बस इतना करना था कि हर कोई क्या कर रहा था (या बहुत से लोगों को भ्रमित कर रहा था)। दूसरे विचार पर, मुझे लगता है कि उन्होंने लोगों को किसी भी तरह भ्रमित कर दिया, लेकिन भाषा के अन्य हिस्सों के साथ: डी – Jakob

4

ECMAScript language specification से:

IterationStatement: के लिए (ExpressionNoIn_opt; Expression_opt; Expression_opt) वक्तव्य

तो पहले अभिव्यक्ति मौजूद है, तो

  1. Let पहले के मूल्यांकन का परिणाम हो testExprRef अभिव्यक्ति।
  2. तो getValue (testExprRef), झूठी वापसी (सामान्य, वी, खाली) है।

पहली अभिव्यक्ति (के लिए दूसरा तर्क) मौजूद नहीं है, इसलिए यह खंड कभी नहीं चलता है, इसलिए लूप बाहर नहीं निकलता है।

1

के मूल्यांकन algorothm नहीं है स्टैंडर्ड ECMA-262 लिपि में पाश का कहना है कि केवल दो परिस्थितियाँ होती हैं जिनमें पाश खत्म हो जाएगा देखते हैं के लिए:

  1. तोड़ बयान
  2. झूठी के बराबर मध्य बयान का मूल्य , लेकिन केवल अगर यह कथन मौजूद है, तो इसे सत्य (संभवतः मोज़िला जेएस इंजन में) के रूप में आवश्यक होना आवश्यक नहीं है।
संबंधित मुद्दे