所以大家,这个可能是一个简单回答的问题。在通过雄辩的javascript工作时,我遇到了一个他使用新的Function构造函数的例子。我想尝试使用我自己的函数createWithEval对这个构造函数进行反向工程,你猜对了eval()函数。我的函数采用name,arg和body参数,它们都是字符串。
function createWithEval(name,arg,body){
var bdy= "function ";
var body2=name;
var body3="("
var body4=arg;
var body5=")"
bdy+=body2+=body3+=body4+=body5;
var body6="{";
var body7=body;
var body8="}";
bdy+=body6+=body7+=body8;
console.log(bdy)
return bdy;
}
eval(createWithEval("xtimesy","x,y","return x*y"));
console.log(xtimesy(2,3))
上面的代码按预期创建了xtimesy函数,但是当我尝试将eval语句放在函数中时,函数在声明时弹出undefined
function createWithEval(name,arg,body){
var bdy= "function ";
var body2=name;
var body3="("
var body4=arg;
var body5=")"
bdy+=body2+=body3+=body4+=body5;
var body6="{";
var body7=body;
var body8="}";
bdy+=body6+=body7+=body8;
console.log(bdy)
return eval(bdy); //should declare and return the xtimesy function
}
createWithEval("xtimesy","x,y","return x*y");
console.log(xtimesy(2,3)) // ---> xtimesy is undefined
我想我可能有范围错误或对eval函数如何工作的不正确理解。欢迎任何输入和/或解决方案。
答案 0 :(得分:-1)
问题是您在eval
函数中运行createWithEval
,因此在createWithEval
范围之外无法使用它。解决此问题的一种方法是使用eval.apply(window,[bdy])
在全局范围内运行eval
:
function createWithEval(name,arg,body, ctx){
var bdy= "function ";
var body2=name;
var body3="("
var body4=arg;
var body5=")"
bdy+=body2+=body3+=body4+=body5;
var body6="{";
var body7=body;
var body8="}";
bdy+=body6+=body7+=body8;
eval.apply(window, [bdy]);
}
createWithEval("xtimesy","x,y","return x*y");
console.log(xtimesy(2,3))