如何在Javascript中使用goto?

我有一些绝对必须使用实现的代码goto。例如,我要编写这样的程序:


start:

alert("RINSE");

alert("LATHER");

repeat: goto start

有没有办法用Javascript做到这一点?


郎朗坤
浏览 8641回答 3
3回答

慕容708150

在经典JavaScript中,您需要使用do-while循环来实现这种类型的代码。我想您可能正在为其他事情生成代码。像将字节码后端备份到JavaScript一样,这样做的方法是将每个标签目标包装在“标签化”的do-while中。LABEL1: do {&nbsp; x = x + 2;&nbsp; ...&nbsp; // JUMP TO THE END OF THE DO-WHILE - A FORWARDS GOTO&nbsp; if (x < 100) break LABEL1;&nbsp; // JUMP TO THE START OF THE DO WHILE - A BACKWARDS GOTO...&nbsp; if (x < 100) continue LABEL1;} while(0);这样使用的每个带标签的do-while循环实际上都会为一个标签创建两个标签点。一个在循环的顶部,另一个在循环的末尾。跳回使用继续,向前跳使用中断。// NORMAL CODEMYLOOP:&nbsp; DoStuff();&nbsp; x = x + 1;&nbsp; if (x > 100) goto DONE_LOOP;&nbsp; GOTO MYLOOP;// JAVASCRIPT STYLEMYLOOP: do {&nbsp; DoStuff();&nbsp; x = x + 1;&nbsp; if (x > 100) break MYLOOP;&nbsp; continue MYLOOP;// Not necessary since you can just put do {} while (1) but it&nbsp; &nbsp; &nbsp;illustrates} while (0)不幸的是,没有其他方法可以做到这一点。普通示例代码:while (x < 10 && Ok) {&nbsp; z = 0;&nbsp; while (z < 10) {&nbsp; &nbsp; if (!DoStuff()) {&nbsp; &nbsp; &nbsp; Ok = FALSE;&nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; }&nbsp; &nbsp; z++;&nbsp; }&nbsp; x++;}&nbsp;假设代码已编码为字节码,那么现在您必须将字节码放入JavaScript中,以出于某些目的模拟后端。JavaScript样式:LOOP1: do {&nbsp; if (x >= 10) break LOOP1;&nbsp; if (!Ok) break LOOP1;&nbsp; z = 0;&nbsp; LOOP2: do {&nbsp; &nbsp; if (z >= 10) break LOOP2;&nbsp; &nbsp; if (!DoStuff()) {&nbsp; &nbsp; &nbsp; Ok = FALSE;&nbsp; &nbsp; &nbsp; break LOOP2;&nbsp; &nbsp; }&nbsp; &nbsp; z++;&nbsp; } while (1);// Note While (1) I can just skip saying continue LOOP2!&nbsp; x++;&nbsp; continue LOOP1;// Again can skip this line and just say do {} while (1)} while(0)因此,使用此技术仅出于简单目的即可完成工作。除此之外,您无能为力。对于普通的Javacript,您永远不需要使用goto,因此除非您明确翻译了其他样式代码以在JavaScript上运行,否则您应该在这里避免使用此技术。例如,我假设这就是他们如何使Linux内核在JavaScript中启动。注意!这都是天真的解释。对于正确的字节码Js后端,还应考虑在输出代码之前检查循环。可以这样检测到许多简单的while循环,然后您可以使用循环而不是goto。

MMTTMM

绝对!有一个名为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) {&nbsp; console.log("Hello, world!");&nbsp; i++;&nbsp; if(i < 538) continue start;&nbsp; break;}该预处理过程存在一些限制,因为while循环无法跨越多个功能或块。不过,这没什么大不了的-我相信能够利用gotoJavaScript的好处绝对会让您不知所措。上面所有通往goto.js库的链接都是DEAD DEAD,这是需要的链接:goto.js(未压缩) --- parseScripts.js(未压缩)从Goto.js:PS对于任何想知道的人(到目前为止共有零个人),Summer of Goto是Paul Irish推广的一个术语,同时讨论了该脚本和PHP决定将goto添加到他们的语言中。对于那些没有立即意识到这整个事情是在开玩笑的人,请原谅我。<—(保险)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript