不能eval break语句

时间:2012-08-14 22:53:03

标签: javascript eval

为什么这段代码:

    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()中断陈述?

提前谢谢!

编辑:

我现在感到困惑。 ^^

  • 为什么会失败?
  • 杰克·万德斯当时是否正确得到它 拥有'执行上下文'?
  • 如果是,为什么他的榜样不起作用?

2 个答案:

答案 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存在和函数标签之类的东西似乎会在以后检查。