为什么这段代码:
var myBreak = 'break;';
for(var i=0; i < 5; i++) {
console.log('i is : ' + i);
eval(myBreak);
}
console.log('done !');
触发:
unlabelled break must be inside loop or switch
Firebug中的错误消息代替在控制台中返回done !
?
是否无法eval()
中断陈述?
提前谢谢!
编辑:
我现在感到困惑。 ^^
答案 0 :(得分:2)
eval
代码在自己的执行上下文中执行;基本上,这意味着当break;
执行时,它不知道它是在for
循环中执行的。
如果您标记break
,则应该有效:
var myBreak = 'break myLoop;';
myLoop:
for(var i=0; i < 5; i++) {
console.log('i is : ' + i);
eval(myBreak);
}
console.log('done !');
答案 1 :(得分:2)
eval解析/评估JavaScript解释器的新实例中的代码。代码最终在原始解释器代码的上下文中执行,但代码必须能够在没有外部上下文的情况下执行,因为新实例对它是盲目的。
因此alert(eval(this.constructor.name))
将为您提供正确的对象上下文名称(全局窗口)。
但是这些会失败,因为实例不会“看到”彼此的代码,直到它被单独的解释器评估,并且在这个阶段,一个部分失败而没有另一个:
try{}eval('catch(){}');
for(;;){ eval('break;'); }
myLoop: eval('for(;;){ break myLoop; }');
简短版本:代码将按预期工作,但是eval中的任何内容都必须是您可以在任何其他上下文中触发的内容。
基本上,在考虑值和范围以及对象上下文之前,先进行初步解析/错误检查。完成所有操作后,代码可以协同工作,并检查是否要调用尚未定义的var。在此之前,新的解释器只在检查错误时才会看到eval中的内容。在中断的情况下,它看不到的是环路或围绕它的开关。
在早期的解析/评估阶段会考虑循环标签,而var存在和函数标签之类的东西似乎会在以后检查。