2017-05-22 78 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