我正在研究一种将代码注入现有代码的调试器。然后使用eval()记录并运行它。
然而,eval()似乎只在其现有范围内起作用。为了解决这个问题,我尝试添加一个在每个本地范围内重新创建的类。但它不起作用。
我添加了代码来说明我的问题。第一个警报按预期工作,我假设这是因为MyClass是在同一范围内创建的。
即使我在TestC函数内部将本地范围中的b设置为20,第二个警报仍然显示为10。最后一个警报不起作用eval()在控制台中返回“Uncaught ReferenceError:c未定义”。
如果我在每个函数中添加整个MyClass并分配它,那么它可以工作,但这不是一个优雅的解决方案。并且可以为项目添加1000行代码。
http://jsfiddle.net/ekim/zryj3taq/2/
var MyClass = function()
{
this.MyAlert = function(codex)
{
eval(codex);
}
}
var b = 10;
var MyOne = new MyClass();
MyOne.MyAlert("alert(b);");
function TestC()
{
var b = 20;
var MyOne2 = new MyClass();
MyOne2.MyAlert("alert(b);");
var c = 20;
var MyOne2 = new MyClass();
MyOne2.MyAlert("alert(c);");
}
TestC();
答案 0 :(得分:1)
您可以使用new Function(\[arg1\[, arg2\[, ...argN\]\],\] functionBody)
(function(){
var str = "return (A+B)*C";
var myFunc = new Function("A","B","C", str);
var result = myFunc(2,3,4);
console.log(result);
}());
/* Example with function */
(function(){
var fncDouble = function (X) {
return X*2;
}
var str = "return F(A)+B";
var myFunc = new Function("F","A","B", str);
var result = myFunc(fncDouble,3,1);
console.log(result);
}());
答案 1 :(得分:0)
据我所知,没有简单的解决方案,因为eval()
函数只是创建一个新的独立编译器。
答案 2 :(得分:0)
试试这个:MyOne2.MyAlert.call(this, "alert(b)");