2012-02-08 7 views
5

मेरे दोस्तों में से एक जावास्क्रिप्ट के साथ एक प्रोग्रामिंग क्लास पढ़ रहा है और उसके असाइनमेंट में से एक संख्या अनुमान लगाने वाला गेम बनाना था।क्या जावास्क्रिप्ट में ब्रेक कीवर्ड केवल लूप को तोड़ने के लिए है?

funProgram: for(;;) { 
    numberGuesser: { 
    var num = (Math.random() * 100) | 0; 
    var guess = +prompt("I'm thinking of a number between 0 and 100. Try to guess it.", 0); 
    var guesses = 1; 
    guess: for(;;) { 
     higher: { 
     lower: { 
      if(guess === num) break guess; 
      if(guess > num) break lower; 
      guess = +prompt("Too low. Try again.", 0); 
      break higher; 
     } 
     guess = +prompt("Too high. Try again.", 0); 
     } 
     guesses++; 
    } 
    alert("You got it in " + guesses + " guesses! The number is " + num); 
    } 
    var again = prompt("Do you want to guess again (y/n)?", "y") === "y"; 
    if(!again) break funProgram; 
} 

उसने मुझसे कहा कि यह अपने कोड लेबल और इसके चारों ओर ब्लॉक रैप करने के लिए ताकि आप आसानी से देख सकते हैं कि प्रत्येक अनुभाग कर रही है एक अच्छा अभ्यास है: यह उसके उदाहरण दिया गया था। उन्होंने यह भी कहा कि लेबल किए गए ब्रेक और जारी किए गए लोगों की तुलना में जारी रखना बहुत आसान है क्योंकि आप जान सकते हैं कि आप वास्तव में क्या कर रहे हैं। मैंने इस तरह के किसी भी कोड पैटर्न कभी नहीं देखा है, इसलिए मुझे यकीन नहीं है कि यह सच है या नहीं।

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

उत्तर

3

can in fact have labels तोड़ता है (और उन्हें स्वीकार करें)। हालांकि, मुझे यकीन नहीं है कि "वह" कौन है, लेकिन मैं कहूंगा कि "हे" एक विशिष्ट मानक के बजाय प्रोग्रामिंग के अपने आदर्शों को संदेश दे रहा है। ऐसा कहने के लिए, लेबल का उपयोग करने की कोई आवश्यकता नहीं है, यह सिर्फ उस विशेष व्यक्ति को अधिक सुगम बनाता है। (और, आईएमएचओ, लेबल बेसिक/गोटो दिनों की याद दिलाते हैं जो आम तौर पर Spaghetti Code में परिणाम देते हैं)।

अतिरिक्त क्रेडिट: यदि वे बेसिक में लिखते थे तो अपने दोस्त से पूछें; मैं सट्टेबाजी कर रहा हूं कि आपको "हां" मिलेगा (पाठ्यक्रम की अवधि के लिए बहुत बुरी आदतों के साथ - यह प्रोफाइल नहीं है, मुझे अभी भी बेसिक/वीबी प्रोग्रामर के साथ अच्छा अनुभव नहीं हुआ है [वर्तमान ] कोडिंग पैटर्न))

break आदेश आमतौर पर छोरों बाहर निकलने के लिए प्रयोग किया जाता है, फिर भी अगर कोड ब्लॉक किसी लेबल में नीडिंत है, तो आप अभी तक एक और ब्लॉक है जो आप से तोड़ सकते हैं स्थापित करने जा रहे हैं। यह आपको थोड़ी अधिक लचीलापन भी देता है जहां से बाहर निकलने के लिए ब्रेक का मतलब है। उदाहरण के लिए:

for (;;){ // "for a" 
    for(;;){ // "for b" 
    break; // breaks "for b" 
    } 
} 

इस उदाहरण में, break केवल नेस्टेड ("ख के लिए") पाश से बाहर निकलने के लिए है। हालांकि:

myblock: { 
    for(;;){ 
    for(;;){ 
     break mybock; // breaks label "myblock" 
    } 
    } 
} 

इस मामले में, ब्रेक वास्तव में दोनों छोरों से बाहर निकल रहा है, क्योंकि आप पूरी तरह से लेबल ब्लॉक छोड़ने की यह निर्देश देते रहे हैं।यह लगभग होने की तरह होगा:

function myblock(){ 
    for(;;){ 
    for(;;){ 
     return; // exits function "myblock" 
    } 
    } 
} 

कहाँ return ब्लॉक break myblock में कार्य करता है जिस तरह से करने के लिए इसी तरह के बाहर निकालता है।


वैसे, नहीं कुछ नहीं के लिए, मैं इस एक बालक पढ़ने में आसान लगता है:

var again = true; 
while (again){ 
    var num = (new Date()).getMilliseconds() % 100, 
     guess = +prompt("I'm thinking of a number between 0 and 100. Try to guess it.", "1"), 
     guesses = 1; 
    while (num !== guess){ 
     guesses++; 
     guess = +prompt((guess < num ? "Too low." : "Too high.") + " Try again.", guess); 
    } 
    alert("You got it in " + guesses + " guesses! The number is " + num); 
    again = prompt("Do you want to guess again? (y/n)", "y") == "y"; 
} 
+0

+1। मैं विपरीत बाड़ पर एक होगा ... "वह"। मैं कहूंगा कि सभी "मानक" ब्रेक लेबलिंग कोड * कम * पठनीय बना देगा, क्योंकि लेबल के "रोज़गार के उपयोग" की कमी से यह खड़ा हो जाता है "यह मानक 'ब्रेक' से अलग है, जिसका अर्थ है कि मैं ' यह सुनिश्चित करने में समय लगेगा कि यह 'ब्रेक' वास्तव में काम करता है जैसा कि लेबल के बिना होगा। – JimmiTh

0

From MDN (बोल्ड जोर मेरा):

break बयान एक वैकल्पिक लेबल है कि कार्यक्रम एक लेबल बयान से बाहर तोड़ अनुमति देता है। इस लेबल किए गए कथन के भीतर break कथन होना चाहिए। लेबल वाला कथन कोई block कथन हो सकता है; इसे लूप कथन से पहले नहीं होना चाहिए।

तो, हाँ, लूप के बाहर लेबल का उपयोग किया जा सकता है, लेकिन, नहीं, आप उन्हें फ़ंक्शन से वापस आने के लिए उपयोग नहीं कर सकते हैं।

0

उन break बयान एक ही तरीका है कि goto बड़े भाषाओं में प्रयोग किया जाता है में इस्तेमाल किया जा रहा है। और जैसे शार्क ने बताया: आप उन्हें स्विच स्टेटमेंट्स में भी इस्तेमाल कर सकते हैं, लेकिन कार्यों में नहीं।

यह क्योंकि वह अनंत for(;;) छोरों के साथ संयोजन के रूप में लेबल ब्लॉकों का उपयोग कर रहा है शायद आप के लिए भ्रामक है। अधिक जानकारी के लिए इस लेख यहाँ पर

देखो: http://james.padolsey.com/javascript/labelled-blocks-useful/

1

मैं label और जावास्क्रिप्ट में break पर एक छोटे से अनुसंधान के बाद कोड को समझ सकता हूँ। हालांकि, मैं व्यक्तिगत रूप से कोडिंग के उस शैली पसंद नहीं है, जिसका मुख्य कारण लेबल block वाक्य रचना भी शाब्दिक ऑब्जेक्ट नोटेशन के समान है - जो मैं एक बहुत का उपयोग करें। और लेबल्स पर मोज़िला के दस्तावेज भी हमें उनसे बचने के लिए कहते हैं:

लेबल आमतौर पर जावास्क्रिप्ट में उपयोग नहीं किए जाते हैं क्योंकि वे प्रोग्राम को समझने के लिए कठिन बनाते हैं। जितना संभव हो, लेबल का उपयोग करने से बचें और, मामलों के आधार पर, फ़ंक्शन कॉल करना या त्रुटि फेंकना पसंद करते हैं।

अपने उद्देश्य सवालों के बारे में:

  1. breakfor छोरों, while छोरों और case बयान है, साथ ही लेबल blocks बाहर निकलने के लिए इस्तेमाल किया जा सकता।

  2. आप फ़ंक्शन से बाहर निकलने के लिए break का उपयोग नहीं कर सकते हैं, तो आपको return का उपयोग करना होगा।

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