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()
函数,并且您将在该函数的上下文之外进行初始化。