0
function executer(text){
  var result = eval(text);
}

executer("var _sc_a=5");
executer("_sc_a>6");

执行器的第二次调用返回我一个“未定义”的结果,这是因为在第二次调用中,eval 不知道它_sc_a=5被初始化了吗?我应该如何让执行者的第二次调用知道第一次调用?

更新:我正在开发的项目是一个基于 C++ Web 的翻译器,它能够评估条件表达式、跟踪变量值并显示解释器读取流程(循环语句)

我有一个next按钮,可以在用户单击时逐步翻译/评估/执行片段next

fragment[0]="var a=0,b;";//already translated from "int a=0,b;"
fragment[1]="a=5;";
fragment[2]="((a>1)&&(a<10));";

$('#next').click(function(e) {
   //setting of ctr here to decide which fragment element should be called
   current(fragment[ctr]);
});

   function current(text){
       try{
           eval(text);
       }

       catch(err){
           alert("Eval error found");
       }
   }
4

2 回答 2

1

由于您在 nonstrict 下运行直接 eval,tldr 版本是您正在运行与此等效的代码:

function executer(text) {
    var result;
    var _sc_a = 5;
}
_sc_a > 6;

所以很容易看出为什么第二个 eval 不像你想要的那样工作。


问题很复杂,是的,如果你直接在非严格模式下调用eval,它会在本地引入变量。所以你需要严格模式来获得词法作用域。

如果您在严格模式下执行此操作,则该变量将在任何地方都不为人所知。

如果你通过在非严格模式下间接调用 eval 来做到这一点,它将引入一个全局变量。

如果您通过在严格模式下间接调用 eval 来做到这一点,它不会再次引入任何新变量。

于 2013-09-20T17:01:42.420 回答
0

是的。eval()作用于executer()函数,并且您在该函数的上下文之外进行初始化。

于 2013-09-20T17:01:35.867 回答