2

为什么是这段代码:

    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()打破陈述吗?

先感谢您 !

编辑 :

我现在很困惑。^^

  • 为什么会失败?
  • Jack Wanders 是否对 eval 拥有自己的“执行上下文”?
  • 如果是,为什么他的例子不起作用?
4

2 回答 2

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 !');
于 2012-08-14T23:00:47.683 回答
2

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

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

但是这些将失败,因为实例在由单独的解释器评估之前不会“看到”彼此的代码,并且在这个阶段,一个片段在没有另一个的情况下失败:

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

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

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

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

所以基本上,初步解析/错误检查是在考虑值和范围和对象上下文之前完成的。一旦这一切完成,代码就可以协同工作,并检查您是否正在调用尚未定义的 var。在此之前,新的解释器在检查错误时只看到 eval 中的内容。在那个中断的情况下,它看不到的是一个循环或一个围绕它的开关。

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

于 2012-08-14T23:36:27.207 回答