为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Javascript中使用goto?

如何在Javascript中使用goto?

郎朗坤 2019-11-26 14:53:45
我有一些绝对必须使用实现的代码goto。例如,我要编写这样的程序:start:alert("RINSE");alert("LATHER");repeat: goto start有没有办法用Javascript做到这一点?
查看完整描述

3 回答

?
慕容708150

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。


查看完整回答
反对 回复 2019-11-26
?
MMTTMM

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添加到他们的语言中。


对于那些没有立即意识到这整个事情是在开玩笑的人,请原谅我。<—(保险)。


查看完整回答
反对 回复 2019-11-26
  • 3 回答
  • 0 关注
  • 8640 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号