eval()的执行只会在调用它的函数内知道(作用域)吗?

时间:2013-09-20 16:55:15

标签: javascript eval

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

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

执行者的第二次调用会给我一个“未定义”的结果,这是因为在第二次调用中,eval不知道_sc_a=5是初始化的吗?我应该如何在执行者的第二次召唤中知道第一个电话?

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

我有一个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");
       }
   }

2 个答案:

答案 0 :(得分:1)

由于你在nonstrict下运行direct eval,tldr版本就是你正在运行与此相当的代码:

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

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


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

如果你在严格模式下这样做,那么在任何地方都不会知道变量。

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

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

答案 1 :(得分:0)

是。 eval()的范围限定为executer()函数,并且您正在该函数的上下文之外进行初始化。