无法EVAL break语句(Can't eval break statement)

2019-09-21 05:18发布

为什么是这一段代码:

    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() break语句?

先感谢您 !

编辑:

现在我越来越糊涂了。 ^^

  • 它为什么会失败?
  • 杰克·万德斯右然后,用它自己的“执行上下文” EVAL?
  • 如果是的话,为什么不是他的榜样的工作?

Answer 1:

EVAL解析/在JavaScript解释器的新实例计算代码。 该代码最终执行与原来的解释器的代码上下文,但是代码必须能够因为新的实例忽视它没有外部上下文中执行。

所以alert(eval(this.constructor.name))会给你正确的对象上下文名称(窗口全球)。

但是这些将失败,因为实例不“看到”对方的代码,直到它被单独解释,并在此阶段一块没有其他失败评估:

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

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

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

短版:代码将作为预期,但在一个eval东西必须要的东西,你可以通过本身在火任何其他方面。

所以基本上,被认为是值和范围和对象上下文之前初步分析/错误检查完成。 一旦这样做了所有的代码可以采取一致行动,并进行检查喜欢的事情不管你调用一个尚未定义的变种。 在此之前,新的解释只能看到什么在E​​VAL,当它检测错误。 在那个破的情况下,它不会看到的是一个环或周围的开关。

而像变种的存在和功能标签的东西似乎是后来查环标签是在这个早期分析/评估阶段考虑。



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


文章来源: Can't eval break statement