Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript eval()的执行是否只在调用它的函数内部已知(作用域)?_Javascript_Eval - Fatal编程技术网

Javascript eval()的执行是否只在调用它的函数内部已知(作用域)?

Javascript eval()的执行是否只在调用它的函数内部已知(作用域)?,javascript,eval,Javascript,Eval,executer的第二次调用返回一个“未定义”的结果,这是因为在第二次调用中,eval不知道\u sc\u a=5已初始化吗?我应该如何让执行者的第二次呼叫知道第一次呼叫 Update :IM项目是一个基于C++的基于Web的翻译器,它有能力评估条件ExPR、跟踪变量值并显示解释器读流(循环语句) 我有一个next按钮,当用户单击next function executer(text){ var result = eval(text); } executer("var _sc_a=5"

executer的第二次调用返回一个“未定义”的结果,这是因为在第二次调用中,eval不知道
\u sc\u a=5
已初始化吗?我应该如何让执行者的第二次呼叫知道第一次呼叫

<强> Update :IM项目是一个基于C++的基于Web的翻译器,它有能力评估条件ExPR、跟踪变量值并显示解释器读流(循环语句)

我有一个
next
按钮,当用户单击
next

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

executer("var _sc_a=5");
executer("_sc_a>6");
fragment[0]=“var a=0,b;”//已从“int a=0,b
片段[1]=“a=5;”;

片段[2]=”((a>1)和&(aYes.
eval()
的作用域是
executer()
函数,您在该函数的上下文之外进行初始化。

由于您在非严格条件下运行直接eval,tldr版本是指您运行的代码与此等效:

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");
       }
   }
因此,很容易理解为什么第二次评估没有按照您的预期进行


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

如果您在严格模式下执行此操作,那么变量在任何地方都是未知的

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


如果您在严格模式下间接调用eval,它将不会再次引入任何新变量。

请向我提供新信息,谢谢。如果有该代码,我将如何在非严格模式下调用它?@fireflieslive默认为非严格模式。您必须通过
使用严格模式显式激活严格模式“;
如果您需要严格模式。严格模式将禁用该语言的许多WTF功能,并使其更容易避免细微的错误。更详细的是,我的意思是如何调用它,以便对eval()的第一次求值将为对eval()的第二次求值所知。”?不同的评估调用之间没有实际关系,您应该解释实际问题,以便找到适当的解决方案used@fireflieslive是的,你不能用eval来做这件事。那根本没有意义。你需要自己动手做一个解释程序。我该如何称呼它,以便eval()的第一次评估eval()的第二次求值将知道?如果逐行解释,为什么不将数组中的每个元素连接到当前调用?解释实际上是一次一个片段(每次单击“下一步”),也有跳过片段元素的情况(例如,条件stmt中的片段为false)这超出了我破解javascript的能力,老实说,我的职业生涯一直在有意识地避免
eval()
,因此我无法提供任何关于操作/维护范围和上下文的进一步见解=\
function executer(text) {
    var result;
    var _sc_a = 5;
}
_sc_a > 6;