मेरे पास कुछ कोड हैं जिनका उपयोग करके मुझे बिल्कुल लागू करना होगा goto
। उदाहरण के लिए, मैं इस तरह एक कार्यक्रम लिखना चाहता हूं:
start:
alert("RINSE");
alert("LATHER");
repeat: goto start
क्या जावास्क्रिप्ट में ऐसा करने का कोई तरीका है?
मेरे पास कुछ कोड हैं जिनका उपयोग करके मुझे बिल्कुल लागू करना होगा goto
। उदाहरण के लिए, मैं इस तरह एक कार्यक्रम लिखना चाहता हूं:
start:
alert("RINSE");
alert("LATHER");
repeat: goto start
क्या जावास्क्रिप्ट में ऐसा करने का कोई तरीका है?
जवाबों:
पूर्ण रूप से! समर ऑफ़ गोटो नामक एक परियोजना है जो आपको जावास्क्रिप्ट का उपयोग अपनी पूरी क्षमता से करने की अनुमति देती है और आपके कोड को लिखने के तरीके में क्रांति लाएगी।
यह जावास्क्रिप्ट प्रीप्रोसेसिंग टूल आपको एक लेबल बनाने की अनुमति देता है और फिर इस सिंटैक्स का उपयोग करके गोटो:
[lbl] <label-name>
goto <label-name>
उदाहरण के लिए, प्रश्न में उदाहरण इस प्रकार लिखा जा सकता है:
[lbl] start:
alert("LATHER");
alert("RINSE");
[lbl] repeat: goto start;
ध्यान दें कि आप केवल एक सामान्य LATHER
RINSE
दोहराव चक्र जैसे साधारण तुच्छ कार्यक्रमों तक सीमित नहीं हैं - इसके द्वारा वहन की जाने वाली संभावनाएं goto
अनंत हैं और आप Hello, world!
जावास्क्रिप्ट कंसोल को 538 बार इस तरह से भी संदेश दे सकते हैं :
var i = 0;
[lbl] start:
console.log("Hello, world!");
i++;
if(i < 538) goto start;
आप गोटो को कैसे लागू किया जाता है , इसके बारे में अधिक पढ़ सकते हैं , लेकिन मूल रूप से, यह कुछ जावास्क्रिप्ट प्रीप्रोसेसिंग करता है जो इस तथ्य का लाभ उठाता है कि आप एक लेबल वाले while
लूप के साथ गोटो का अनुकरण कर सकते हैं । इसलिए, जब आप "हैलो, दुनिया!" लिखते हैं। उपरोक्त कार्यक्रम, यह कुछ इस तरह से अनुवादित हो जाता है:
var i = 0;
start: while(true) {
console.log("Hello, world!");
i++;
if(i < 538) continue start;
break;
}
इस प्रीप्रोसेसिंग प्रक्रिया की कुछ सीमाएँ हैं, क्योंकि लूप कई कार्यों या ब्लॉकों में खिंचाव नहीं कर सकते हैं। यह कोई बड़ी बात नहीं है, हालांकि, मुझे यकीन है कि goto
जावास्क्रिप्ट में लाभ लेने में सक्षम होने के फायदे आपको पूरी तरह से प्रभावित करेंगे।
उपरोक्त सभी लिंक जो goto.js लाइब्रेरी की ओर ले जाते हैं, वे सभी DEAD हैं, यहाँ आवश्यक लिंक हैं:
goto.js (असम्पीडित) --- parseScripts.js (असम्पीडित)
से Goto.js :
PS जो कोई भी सोच रहा है (अब तक कुल शून्य लोग) के लिए, समर ऑफ़ गोटो एक शब्द है जिसे पॉल आयरिश ने लोकप्रिय किया था, जबकि इस स्क्रिप्ट और PHP के गोटो को अपनी भाषा में जोड़ने के फैसले पर चर्चा की।
और जो लोग तुरंत नहीं पहचानते हैं कि यह पूरी बात एक मजाक है, कृपया मुझे माफ कर दें। <- (बीमा)।
goto
है कि संभवतः इसका उपयोग किया जा रहा है। यह कुछ बहुत अच्छी त्रुटि हैंडलिंग पैटर्न के लिए बनाता है। हेक, हम उपयोग करते हैं switch
, जो goto
सभी लेकिन नाम में है, और कोई भी पेट-दर्द नहीं करता है।
नहीं, उन्होंने इसे ECMAScript में शामिल नहीं किया है:
ECMAScript में कोई गोटो स्टेटमेंट नहीं है।
goto
सिर्फ "फीचर्स" की जावास्क्रिप्ट के कॉकटेल में पूरी तरह से फिट होगा :) :)
goto
हालाँकि भविष्य में उपयोग के लिए एक आरक्षित कीवर्ड है। हम केवल आशा कर सकते हैं :)
goto
जब आप एक नेस्टेड फ़ंक्शन से वापस लौटना चाहते हैं तो उपयोगी होगा। उदाहरण के लिए, जब अंडरस्कोर। Js का उपयोग करते हैं, तो आप सरणियों पर पुनरावृति करते समय एक अनाम फ़ंक्शन प्रदान करते हैं। आप इस तरह के एक समारोह के अंदर से वापस नहीं आ सकते हैं, इसलिए goto end;
यह उपयोगी होगा।
दरअसल, मैं देख रहा हूं कि ECMAScript (जावास्क्रिप्ट) INESED में एक गोटो स्टेटमेंट है। हालाँकि, जावास्क्रिप्ट गोटो के दो फ्लेवर हैं!
गोटो के दो जावास्क्रिप्ट फ्लेवर्स को लेबल जारी और लेबल ब्रेक कहा जाता है। जावास्क्रिप्ट में कोई कीवर्ड "गोटो" नहीं है। गोटो ब्रेक और जारी कीवर्ड का उपयोग करके जावास्क्रिप्ट में पूरा किया जाता है।
और यह कमोबेश w3schools की वेबसाइट http://www.w3schools.com/js/js_switch.asp पर स्पष्ट रूप से कहा गया है ।
मुझे लगता है कि लेबल जारी है और लेबल विराम कुछ अजीब तरह से व्यक्त किए गए हैं।
लेबल जारी और लेबल विराम के बीच का अंतर वह है जहाँ उनका उपयोग किया जा सकता है। लेबल जारी केवल थोड़ी देर लूप के अंदर इस्तेमाल किया जा सकता है। कुछ और जानकारी के लिए w3schools देखें।
===========
एक और दृष्टिकोण जो काम करेगा, वह है एक विशाल जबकि बयान के साथ एक विशाल स्विच स्टेटमेंट अंदर:
while (true)
{
switch (goto_variable)
{
case 1:
// some code
goto_variable = 2
break;
case 2:
goto_variable = 5 // case in etc. below
break;
case 3:
goto_variable = 1
break;
etc. ...
}
}
break
और छोरों में भी continue
इस्तेमाल किया जा सकता for
है। लेकिन वे वास्तव में दिए गए समान नहींgoto
हैं कि वे संबंधित लूप (एस) की संरचना में बंद हैं, goto
जिसकी तुलना में निश्चित रूप से - उन भाषाओं में हो सकती हैं - जिनके पास कहीं भी है।
क्लासिक जावास्क्रिप्ट में आपको इस प्रकार के कोड को प्राप्त करने के लिए डू-जबकि लूप का उपयोग करना होगा। मुझे लगता है कि आप शायद किसी और चीज के लिए कोड उत्पन्न कर रहे हैं।
इसे करने का तरीका, जैसे कि बाइटकोड को जावास्क्रिप्ट में शामिल करने के लिए हर लेबल लक्ष्य को "लेबल" करते समय लपेटना है।
LABEL1: do {
x = x + 2;
...
// JUMP TO THE END OF THE DO-WHILE - A FORWARDS GOTO
if (x < 100) break LABEL1;
// JUMP TO THE START OF THE DO WHILE - A BACKWARDS GOTO...
if (x < 100) continue LABEL1;
} while(0);
आपके द्वारा लेबल किए गए प्रत्येक लूप जबकि आप इस तरह उपयोग करते हैं, वास्तव में एक लेबल के लिए दो लेबल बिंदु बनाता है। एक शीर्ष पर और एक पाश के अंत में। वापस कूदना जारी रहता है और आगे की ओर कूदने से ब्रेक का उपयोग होता है।
// NORMAL CODE
MYLOOP:
DoStuff();
x = x + 1;
if (x > 100) goto DONE_LOOP;
GOTO MYLOOP;
// JAVASCRIPT STYLE
MYLOOP: do {
DoStuff();
x = x + 1;
if (x > 100) break MYLOOP;
continue MYLOOP;// Not necessary since you can just put do {} while (1) but it illustrates
} while (0)
दुर्भाग्य से ऐसा करने का कोई और तरीका नहीं है।
सामान्य उदाहरण कोड:
while (x < 10 && Ok) {
z = 0;
while (z < 10) {
if (!DoStuff()) {
Ok = FALSE;
break;
}
z++;
}
x++;
}
तो मान लीजिए कि कोड बायकोड्स से एनकोड हो जाता है, इसलिए अब आपको किसी उद्देश्य के लिए अपने बैकएंड का अनुकरण करने के लिए जावास्क्रिप्ट में बाईटेककोड डालना होगा।
जावास्क्रिप्ट शैली:
LOOP1: do {
if (x >= 10) break LOOP1;
if (!Ok) break LOOP1;
z = 0;
LOOP2: do {
if (z >= 10) break LOOP2;
if (!DoStuff()) {
Ok = FALSE;
break LOOP2;
}
z++;
} while (1);// Note While (1) I can just skip saying continue LOOP2!
x++;
continue LOOP1;// Again can skip this line and just say do {} while (1)
} while(0)
इसलिए इस तकनीक का उपयोग करना सरल उद्देश्यों के लिए ठीक काम करता है। इसके अलावा और कुछ नहीं जो आप कर सकते हैं।
सामान्य Javacript के लिए आपको कभी भी गोटो का उपयोग करने की आवश्यकता नहीं होनी चाहिए, इसलिए आपको संभवतः इस तकनीक से बचना चाहिए जब तक कि आप विशिष्ट रूप से जावास्क्रिप्ट पर चलने के लिए अन्य शैली कोड का अनुवाद नहीं कर रहे हैं। मुझे लगता है कि उदाहरण के लिए वे जावास्क्रिप्ट को बूट करने के लिए लिनक्स कर्नेल कैसे प्राप्त करते हैं।
ध्यान दें! यह सब भोली व्याख्या है। JEC के उचित बैकएंड के लिए कोड को आउटपुट करने से पहले लूप की जांच करने पर भी विचार करें। कई सरल जबकि छोरों को ऐसे ही पहचाना जा सकता है और फिर आप गोटो के बजाय लूप का उपयोग कर सकते हैं।
continue
एक do ... while
लूप में चेक की स्थिति बनी रहती है । इस तरह से goto
यहाँ पीछे की ओर do ... while (0)
काम नहीं करता है। ecma-international.org/ecma-262/5.1/#sec-12.6.1
let doLoop
लिए काम करना होगा। और मुख्य लूप: let doLoop = false; do { if(condition){ doLoop = true; continue; } } while (doLoop)
github.com/patarapolw/HanziLevelUp/blob/…
यह एक पुराना सवाल है, लेकिन चूंकि जावास्क्रिप्ट एक चलती लक्ष्य है - यह उचित पूंछ कॉल का समर्थन करने वाले कार्यान्वयन पर ES6 में संभव है। उचित पूंछ कॉल के लिए समर्थन के साथ कार्यान्वयन पर, आप सक्रिय पूंछ कॉल की एक अनबाउंड संख्या हो सकती है (यानी टेल कॉल "स्टैक विकसित नहीं")।
ए goto
को बिना पैरामीटर वाले टेल कॉल के रूप में सोचा जा सकता है।
उदाहरण:
start: alert("RINSE");
alert("LATHER");
goto start
के रूप में लिखा जा सकता है
function start() { alert("RINSE");
alert("LATHER");
return start() }
यहाँ करने के लिए कॉल start
टेल पोजिशन है, इसलिए स्टैक ओवरफ्लो नहीं होगा।
यहाँ एक और अधिक जटिल उदाहरण है:
label1: A
B
if C goto label3
D
label3: E
goto label1
सबसे पहले, हम स्रोत को ब्लॉक में विभाजित करते हैं। प्रत्येक लेबल एक नए ब्लॉक की शुरुआत को इंगित करता है।
Block1
label1: A
B
if C goto label3
D
Block2
label3: E
goto label1
हमें गोटो का उपयोग करके ब्लॉकों को एक साथ बांधने की आवश्यकता है। उदाहरण में ब्लॉक ई डी का अनुसरण करता है, इसलिए हम एक goto label3
डी जोड़ते हैं ।
Block1
label1: A
B
if C goto label2
D
goto label2
Block2
label2: E
goto label1
अब प्रत्येक ब्लॉक एक फ़ंक्शन बन जाता है और प्रत्येक गेटो एक टेल कॉल बन जाता है।
function label1() {
A
B
if C then return( label2() )
D
return( label2() )
}
function label2() {
E
return( label1() )
}
कार्यक्रम शुरू करने के लिए, का उपयोग करें label1()
।
फिर से लिखना विशुद्ध रूप से यांत्रिक है और इस प्रकार एक स्थूल प्रणाली जैसे कि मीठे के साथ किया जा सकता है।
const
start = 0,
more = 1,
pass = 2,
loop = 3,
skip = 4,
done = 5;
var label = start;
while (true){
var goTo = null;
switch (label){
case start:
console.log('start');
case more:
console.log('more');
case pass:
console.log('pass');
case loop:
console.log('loop');
goTo = pass; break;
case skip:
console.log('skip');
case done:
console.log('done');
}
if (goTo == null) break;
label = goTo;
}
एक for
पाश के बारे में कैसे ? जितनी बार चाहें उतनी बार दोहराएं। या एक while
लूप, एक शर्त पूरी होने तक दोहराएं। नियंत्रण संरचनाएं हैं जो आपको कोड दोहराएंगी। मुझे याद GOTO
है बेसिक में ... इसने इतना बुरा कोड बनाया! आधुनिक प्रोग्रामिंग भाषाएं आपको बेहतर विकल्प देती हैं जिन्हें आप वास्तव में बनाए रख सकते हैं।
ऐसा एक तरीका है जिससे इसे किया जा सकता है, लेकिन इसे सावधानीपूर्वक योजना बनाने की आवश्यकता है। निम्नलिखित QBASIC कार्यक्रम का उदाहरण लें:
1 A = 1; B = 10;
10 print "A = ",A;
20 IF (A < B) THEN A = A + 1; GOTO 10
30 PRINT "That's the end."
फिर पहले सभी वेरिएबल्स को इनिशियलाइज़ करने के लिए अपना जावास्क्रिप्ट बनाएँ, इसके बाद बॉल रोलिंग शुरू करने के लिए एक प्रारंभिक फ़ंक्शन कॉल करें (हम इस प्रारंभिक फ़ंक्शन कॉल को अंत में निष्पादित करते हैं), और आपके द्वारा ज्ञात लाइनों के हर सेट के लिए फ़ंक्शन सेट करेंगे। एक इकाई।
प्रारंभिक फ़ंक्शन कॉल के साथ इसका अनुसरण करें ...
var a, b;
function fa(){
a = 1;
b = 10;
fb();
}
function fb(){
document.write("a = "+ a + "<br>");
fc();
}
function fc(){
if(a<b){
a++;
fb();
return;
}
else
{
document.write("That's the end.<br>");
}
}
fa();
इस उदाहरण में परिणाम है:
a = 1
a = 2
a = 3
a = 4
a = 5
a = 6
a = 7
a = 8
a = 9
a = 10
That's the end.
आम तौर पर, मैं खराब पठनीयता के लिए GoTo का उपयोग नहीं करना चाहूंगा। मेरे लिए, यह पुनरावर्ती कार्यों को प्रोग्राम करने के बजाय सरल पुनरावृत्त कार्यों को प्रोग्रामिंग करने के लिए एक बुरा बहाना है, या इससे भी बेहतर (यदि स्टैक ओवरफ्लो जैसी चीजों की आशंका है), तो उनके सच्चे पुनरावृत्ति विकल्प (जो कभी-कभी जटिल हो सकते हैं)।
कुछ ऐसा होगा:
while(true) {
alert("RINSE");
alert("LATHER");
}
यह सही है कि एक अनंत लूप है। अभिव्यक्ति ("सच्चा") क्लाज के परांठे के अंदर होता है जिसे जावास्क्रिप्ट इंजन जांचता है - और यदि अभिव्यक्ति सही है, तो यह लूप को चालू रखेगा। यहां "सच" लिखना हमेशा सच का मूल्यांकन करता है, इसलिए एक अनंत लूप।
यकीन है, switch
निर्माण का उपयोग कर आप goto
जावास्क्रिप्ट में अनुकरण कर सकते हैं । दुर्भाग्य से, भाषा प्रदान नहीं करती है goto
, लेकिन यह प्रतिस्थापन का एक अच्छा हिस्सा है।
let counter = 10
function goto(newValue) {
counter = newValue
}
while (true) {
switch (counter) {
case 10: alert("RINSE")
case 20: alert("LATHER")
case 30: goto(10); break
}
}
आप शायद इस तरह कुछ जे एस ट्यूटोरियल पढ़ना चाहिए एक ।
अगर यकीन नहीं goto
जेएस में मौजूद है, लेकिन, किसी भी तरह से, यह खराब कोडिंग शैली को प्रोत्साहित करता है और इसे टाला जाना चाहिए।
तुम यह कर सकते थे:
while ( some_condition ){
alert('RINSE');
alert('LATHER');
}
आप एक समारोह का उपयोग कर सकते हैं:
function hello() {
alert("RINSE");
alert("LATHER");
hello();
}
कॉल स्टैक को साफ रखते हुए गोटो जैसी कार्यक्षमता प्राप्त करने के लिए, मैं इस पद्धति का उपयोग कर रहा हूं:
// in other languages:
// tag1:
// doSomething();
// tag2:
// doMoreThings();
// if (someCondition) goto tag1;
// if (otherCondition) goto tag2;
function tag1() {
doSomething();
setTimeout(tag2, 0); // optional, alternatively just tag2();
}
function tag2() {
doMoreThings();
if (someCondition) {
setTimeout(tag1, 0); // those 2 lines
return; // imitate goto
}
if (otherCondition) {
setTimeout(tag2, 0); // those 2 lines
return; // imitate goto
}
setTimeout(tag3, 0); // optional, alternatively just tag3();
}
// ...
कृपया ध्यान दें कि फ़ंक्शन कॉल्स को टाइमआउट कतार में शामिल करने के बाद से यह कोड धीमा है, जिसे बाद में ब्राउज़र के अपडेट लूप में मूल्यांकन किया गया है।
कृपया यह भी ध्यान दें कि आप तर्क पारित कर सकते हैं ( setTimeout(func, 0, arg1, args...)
IE9 की तुलना में नए ब्राउज़र में या setTimeout(function(){func(arg1, args...)}, 0)
पुराने ब्राउज़र में)।
AFAIK, आपको कभी भी ऐसे मामले में नहीं चलना चाहिए जिसमें इस पद्धति की आवश्यकता होती है जब तक आपको async / प्रतीक्षा समर्थन के बिना वातावरण में एक गैर-समानांतर लूप को रोकने की आवश्यकता न हो।
सभी माता-पिता के बंद होने की शुरुआत और अंत
var foo=false;
var loop1=true;
LABEL1: do {var LABEL1GOTO=false;
console.log("here be 2 times");
if (foo==false){
foo=true;
LABEL1GOTO=true;continue LABEL1;// goto up
}else{
break LABEL1; //goto down
}
console.log("newer go here");
} while(LABEL1GOTO);
// example of goto in javascript:
var i, j;
loop_1:
for (i = 0; i < 3; i++) { //The first for statement is labeled "loop_1"
loop_2:
for (j = 0; j < 3; j++) { //The second for statement is labeled "loop_2"
if (i === 1 && j === 1) {
continue loop_1;
}
console.log('i = ' + i + ', j = ' + j);
}
}
इसे प्राप्त करने का एक और वैकल्पिक तरीका पूंछ कॉल का उपयोग करना है। लेकिन, हमारे पास जावास्क्रिप्ट में ऐसा कुछ नहीं है। इसलिए आम तौर पर, JS को नीचे दिए गए दो कीवर्ड का उपयोग करके JS में पूरा किया जाता है। विराम और जारी रखें , संदर्भ: जावास्क्रिप्ट में गोटो स्टेटमेंट
यहाँ एक उदाहरण है:
var number = 0;
start_position: while(true) {
document.write("Anything you want to print");
number++;
if(number < 100) continue start_position;
break;
}