3 回答

TA貢獻1831條經(jīng)驗 獲得超4個贊
在經(jīng)典JavaScript中,您需要使用do-while循環(huán)來實現(xiàn)這種類型的代碼。我想您可能正在為其他事情生成代碼。
像將字節(jié)碼后端備份到JavaScript一樣,這樣做的方法是將每個標簽目標包裝在“標簽化”的do-while中。
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);
這樣使用的每個帶標簽的do-while循環(huán)實際上都會為一個標簽創(chuàng)建兩個標簽點。一個在循環(huán)的頂部,另一個在循環(huán)的末尾。跳回使用繼續(xù),向前跳使用中斷。
// 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++;
}
假設代碼已編碼為字節(jié)碼,那么現(xiàn)在您必須將字節(jié)碼放入JavaScript中,以出于某些目的模擬后端。
JavaScript樣式:
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,您永遠不需要使用goto,因此除非您明確翻譯了其他樣式代碼以在JavaScript上運行,否則您應該在這里避免使用此技術。例如,我假設這就是他們?nèi)绾问筁inux內(nèi)核在JavaScript中啟動。
注意!這都是天真的解釋。對于正確的字節(jié)碼Js后端,還應考慮在輸出代碼之前檢查循環(huán)??梢赃@樣檢測到許多簡單的while循環(huán),然后您可以使用循環(huán)而不是goto。

TA貢獻1869條經(jīng)驗 獲得超4個贊
絕對!有一個名為Summer of Goto的項目,它使您可以最大程度地使用JavaScript,并將徹底改變您編寫代碼的方式。
使用此JavaScript預處理工具,您可以創(chuàng)建標簽,然后使用以下語法轉(zhuǎn)到標簽:
[lbl] <label-name>
goto <label-name>
例如,問題中的示例可以編寫如下:
[lbl] start:
alert("LATHER");
alert("RINSE");
[lbl] repeat: goto start;
請注意,您不僅限于無窮無盡的LATHER RINSE重復循環(huán)這樣的簡單程序,它所提供的可能性goto是無限的,您甚至可以Hello, world!向JavaScript控制臺發(fā)送一條消息538次,如下所示:
var i = 0;
[lbl] start:
console.log("Hello, world!");
i++;
if(i < 538) goto start;
您可以閱讀有關goto的實現(xiàn)方式的更多信息,但是基本上,它會執(zhí)行一些JavaScript預處理,這利用了您可以使用帶標簽的whileloop模擬goto的事實。因此,當您編寫“您好,世界!” 上面的程序,它被翻譯成這樣的東西:
var i = 0;
start: while(true) {
console.log("Hello, world!");
i++;
if(i < 538) continue start;
break;
}
該預處理過程存在一些限制,因為while循環(huán)無法跨越多個功能或塊。不過,這沒什么大不了的-我相信能夠利用gotoJavaScript的好處絕對會讓您不知所措。
上面所有通往goto.js庫的鏈接都是DEAD DEAD,這是需要的鏈接:
goto.js(未壓縮) --- parseScripts.js(未壓縮)
從Goto.js:
PS對于任何想知道的人(到目前為止共有零個人),Summer of Goto是Paul Irish推廣的一個術語,同時討論了該腳本和PHP決定將goto添加到他們的語言中。
對于那些沒有立即意識到這整個事情是在開玩笑的人,請原諒我。<—(保險)。
添加回答
舉報