2009-11-10 12 views
18

संक्षेप में, मैं कोशिश कर रहा हूँ जावास्क्रिप्ट में थोड़ी देर के पाश की हालत-भाग में एक चर घोषित करने के लिए:घोषणा जावास्क्रिप्ट में

while (var b=a.pop()) { 
    do_sth(b) 
} 

फिर भी, अपने ब्राउज़र (फ़ायरफ़ॉक्स) नहीं है स्वीकार करो उसे। इसके बजाय मुझे ऐसा करना होगा:

var b 
while (b=a.pop()) { 
    do_sth(b) 
} 

जो काम करता है। क्या यह व्यवहार अपेक्षित है?

+1

नीचे दिए गए 2 में परिवर्तनीय घोषणा उत्थान की व्याख्या की गई है लेकिन यह समझाएं कि आप एक 'वें' स्थिति के अंदर एक चर घोषित क्यों नहीं कर सकते हैं (लेकिन उदाहरण के लिए, आप 'शर्तों के लिए) में कर सकते हैं। क्या आपको कभी इसके लिए एक अच्छा स्पष्टीकरण मिला? – Barney

+2

एक और जेएस quirk, यही कारण है कि। –

उत्तर

16

जावास्क्रिप्ट में ब्लॉक स्कोप नहीं है। इसमें कार्यक्षेत्र है। तो यह सुनिश्चित करने के लिए कि इंसान और जावास्क्रिप्ट दोनों कोड को उसी तरह पढ़ते हैं, आपको मैन्युअल रूप से कार्यों के शीर्ष तक अपनी विविध घोषणाएं उठाना चाहिए।

यहाँ JSLint अपने कोड के बारे में कहते हैं है:

Problem at line 1 character 8: Expected an identifier and instead saw 'var'. 

उपयोग JSLint, आप JavaScript सीख रहे हैं कम से कम करते हुए। आप बहुत जल्दी सीखेंगे। यह आपकी भावनाओं को चोट पहुंचाएगा।

+0

यह अब – Ced

23

हां, यह है।

आप, आप एक for पाश का उपयोग कर सकते करना चाहते हैं, इस तरह:

for (var b; b = a.pop();) {  //Note the final semicolon 
    do_sth(b); 
} 
6

जावास्क्रिप्ट ब्लॉक गुंजाइश नहीं है। तो सभी var घोषणाएं फ़ंक्शन स्कोप पर हैं। इसलिए while अभिव्यक्ति में एक चर घोषित करना जावास्क्रिप्ट में समझ में नहीं आता है।

इसके अतिरिक्त, आपको अर्धविराम के साथ अपने बयान समाप्त करना चाहिए। यह कड़ाई से जरूरी नहीं है, लेकिन इसकी अत्यधिक अनुशंसा की जाती है।

16

प्रश्न थोड़ा दिनांकित है, लेकिन मुझे लगता है कि उत्तर सभी एक महत्वपूर्ण भेद को याद करते हैं। यही है, while लूप अभिव्यक्ति की अपेक्षा करता है जो एक सशर्त, यानी एक बूलियन या मान को उभारा जाता है जिसे एक बूलियन में परिवर्तित किया जा सकता है। विवरण के लिए Mozilla docs देखें।

एक शुद्ध असाइनमेंट (तत्काल बिना) को एक बूलियन को इसके डिफ़ॉल्ट रिटर्न वैल्यू (दाएं हाथ के मूल्य) के माध्यम से मजबूर किया जाता है।

एक var (या let या const) एक बयान कि एक वैकल्पिक काम की अनुमति देता है, लेकिन undefined की वापसी मूल्य है। अकेले

var foo = 42; // undefined 
bar = 42  // 42 

वापसी मान सवाल का जवाब नहीं है, के बाद से undefined falsey है, लेकिन यहां तक ​​कि अगर आप एक जे एस में एक var डाल देना कि दिखाता है:

आप आसानी से अपने कंसोल में इस परीक्षण कर सकते हैं सशर्त यह हमेशा झूठे का मूल्यांकन करेगा।

अन्य ने for कथन का उल्लेख किया है और वे चर के घोषणा और तत्कालता की अनुमति देते हैं। यह सच है, लेकिन documentation explains कि for एक कथन या सत्यापन की अपेक्षा करता है।

राय भिन्न हो सकती है, लेकिन मेरे लिए यह सब एक समझदार स्थिरता को जोड़ता है जो लूप के संबंध में व्यवहार में एक कर्कश नहीं है।while लूप for लूप के मुकाबले if कथन के लूपिंग संस्करण के रूप में बेहतर विचार है। यदि इनमें से सभी में quirkiness है, तो यह for भाषा के सामान्य वाक्यविन्यास से बयान के थोक विचलन है।

+2

के साथ मामला नहीं है, मैं 'क्यों?' की तलाश में था जावास्क्रिप्ट कॉन्सल की अनुमति नहीं देता है, चलो, कंडीशन के दौरान var var और यह मेरे प्रश्न का उत्तर दिया। मैं हमेशा यह भ्रमित करता हूं कि जब मैंने चर के मान के बजाय एक नया चर बनाया, तो कंसोल ने अपरिभाषित की सूचना दी। मुझे अभी भी जावास्क्रिप्ट को अपरिभाषित लौटने का बिंदु नहीं दिख रहा है; वे वैरिएबल के मान को भी वापस कर सकते हैं, लेकिन यदि यह अपर्याप्त, बेहतर ब्राउज़र और कंपाइलर्स त्रुटि देता है तो सशर्त में उपयोग किया जाता है। –

संबंधित मुद्दे