eval() 的执行是否仅在调用它的函数中已知(作用域)

Does execution of eval() will only be known (scoped) inside the function where it is called?

本文关键字:函数 作用域 执行 是否 eval 调用      更新时间:2023-09-26
function executer(text){
  var result = eval(text);
}
executer("var _sc_a=5");
executer("_sc_a>6");

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

更新:im正在处理的项目是一个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");
       }
   }

由于您在非严格下运行直接评估,因此 tldr 版本是您正在运行的代码等效于以下内容:

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

因此,很容易理解为什么第二个评估不符合您的预期。


这个问题很复杂,是的,如果你直接在非严格模式下调用 eval,它会在本地引入变量。因此,您需要严格的模式来获得词法范围。

如果在严格模式下执行此操作,则变量在任何地方都不知道。

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

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

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