2017-05-22 80 views
0

所以,这个人可能是一个简单的回答问题。在通过雄辩的javascript工作时,我遇到了一个使用新的Function构造函数的例子。我想尝试使用我自己的函数createWithEval对这个构造函数进行逆向工程,使用,你猜对了,eval()函数。我的函数采用名称,arg和body参数,它们都是字符串。eval在一个函数内

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语句,宣布

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

如果'createWithEval'将*回报*功能,您需要写'VAR xtimesy = createWithEval(“xtimesy” ,“x,y”,“return x * y”);'使其可调用 – Bergi

+0

可能重复[Eval字符串到可调用的JS函数](https://stackoverflow.com/a/17792406/1048572)? – Bergi

回答

-1

问题是您在createWithEval函数中运行eval,因此它不在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)) 
+0

'eval.apply'不会改变一件事情。 – Bergi

+0

呃,对不起,我应该已经清楚了:*使用'apply' *本身确实会改变一件事情,但是认为接收者环境很重要[是非常错误的](http://perfectionkills.com/global-eval-what -are-的选项/#windoweval)。不要传递'this'或'window'或任何东西 - 没关系。只需使用'eval.call(null,bdy)'或'(1,eval)(bdy)'。 – Bergi