无法评估中断语句

Can't eval break statement

本文关键字:语句 中断 评估      更新时间:2023-09-26

为什么这段代码是:

    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()中断语句吗?

提前谢谢你!

编辑:

我现在很困惑。^^

  • 为什么会失败?
  • 杰克徘徊在那时与评估有它自己的"执行上下文"?
  • 如果是,为什么他的例子不起作用?

eval 解析/评估 JavaScript 解释器的新实例中的代码。代码最终在原始解释器代码的上下文中执行,但代码必须能够在没有外部上下文的情况下执行,因为新实例对它视而不见。

因此,alert(eval(this.constructor.name))将为您提供正确的对象上下文名称(全局窗口中的窗口)。

但是这些会失败,因为实例在被单独的解释器评估之前不会"看到"彼此的代码,在这个阶段,一个部分失败而没有另一个:

  • try{}eval('catch(){}');

  • for(;;){ eval('break;'); }

  • myLoop: eval('for(;;){ break myLoop; }');

简短版本:代码将按预期工作,但评估中的任何内容都必须是您可以在任何其他上下文中单独触发的东西。

因此,基本上,在考虑值、范围和对象上下文之前,先进行初步解析/错误检查。完成所有操作后,代码可以协同工作,并检查是否正在调用尚未定义的 var。在此之前,新的解释器只有在检查错误时才能看到评估中的内容。在中断的情况下,它看不到的是围绕它的循环或开关。

循环标签在这个

早期解析/评估阶段被考虑,而像var存在和函数标签这样的东西似乎在以后被检查。

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 !');