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