我的问题是: javascript 支持计算的 GOTO 语句吗?
Not really.
P.D:我不需要替代方案,我只是想知道为什么不起作用。
它不起作用,因为在 JavaScript 中,switch语句必须仅包含case blocks http://www.ecma-international.org/ecma-262/6.0/#sec-switch-statement.
虽然you可能不是在寻找解决方法,其他人可能会在寻找问题时发现这个问题,所以无论如何我都会提供一个。
这归功于mnieper https://github.com/mnieper谁建议的asm.js https://github.com/dherman/asm.js/issues/80.
基本思想是有一个while(true)
顶层循环,以及switch
里面的声明。
goto:
while(true)
{
switch(where)
{
// no breaks
case 0:
// some code...
case 1:
// some other code...
// ...
}
}
为了模拟 goto,可以使用
where = 1;
continue goto;
不过,为了模拟 duff 的设备,只需将循环作为外部结构,并在 switch 语句中使用一个变量,该变量在第一次迭代后设置为一个值,该值将触发 switch 语句从第一个开始案件。
所以就你而言,这意味着交换switch
and do...while()
并添加一个default
情况和控制变量:
var where = len % 3;
do {
switch (where) {
default: dst += ',';
case 0: dst += src[i++];
case 2: dst += src[i++];
case 1: dst += src[i++];
}
where = -1;
} while (src[i]);
一般来说,这种方法的一个巨大缺点是它不能跨回调工作,而回调在 JavaScript 中几乎无处不在。
只要它在单个连续的上下文中使用,它就应该起作用。
有关更多信息,请参阅票证发布在 asm.js 存储库上 https://github.com/dherman/asm.js/issues/80.