3 回答

TA贡献1831条经验 获得超4个赞
在经典JavaScript中,您需要使用do-while循环来实现这种类型的代码。我想您可能正在为其他事情生成代码。
像将字节码后端备份到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循环实际上都会为一个标签创建两个标签点。一个在循环的顶部,另一个在循环的末尾。跳回使用继续,向前跳使用中断。
// 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++;
}
假设代码已编码为字节码,那么现在您必须将字节码放入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上运行,否则您应该在这里避免使用此技术。例如,我假设这就是他们如何使Linux内核在JavaScript中启动。
注意!这都是天真的解释。对于正确的字节码Js后端,还应考虑在输出代码之前检查循环。可以这样检测到许多简单的while循环,然后您可以使用循环而不是goto。

TA贡献1869条经验 获得超4个赞
绝对!有一个名为Summer of Goto的项目,它使您可以最大程度地使用JavaScript,并将彻底改变您编写代码的方式。
使用此JavaScript预处理工具,您可以创建标签,然后使用以下语法转到标签:
[lbl] <label-name>
goto <label-name>
例如,问题中的示例可以编写如下:
[lbl] start:
alert("LATHER");
alert("RINSE");
[lbl] repeat: goto start;
请注意,您不仅限于无穷无尽的LATHER RINSE重复循环这样的简单程序,它所提供的可能性goto是无限的,您甚至可以Hello, world!向JavaScript控制台发送一条消息538次,如下所示:
var i = 0;
[lbl] start:
console.log("Hello, world!");
i++;
if(i < 538) goto start;
您可以阅读有关goto的实现方式的更多信息,但是基本上,它会执行一些JavaScript预处理,这利用了您可以使用带标签的whileloop模拟goto的事实。因此,当您编写“您好,世界!” 上面的程序,它被翻译成这样的东西:
var i = 0;
start: while(true) {
console.log("Hello, world!");
i++;
if(i < 538) continue start;
break;
}
该预处理过程存在一些限制,因为while循环无法跨越多个功能或块。不过,这没什么大不了的-我相信能够利用gotoJavaScript的好处绝对会让您不知所措。
上面所有通往goto.js库的链接都是DEAD DEAD,这是需要的链接:
goto.js(未压缩) --- parseScripts.js(未压缩)
从Goto.js:
PS对于任何想知道的人(到目前为止共有零个人),Summer of Goto是Paul Irish推广的一个术语,同时讨论了该脚本和PHP决定将goto添加到他们的语言中。
对于那些没有立即意识到这整个事情是在开玩笑的人,请原谅我。<—(保险)。
添加回答
举报