2017-05-22 4 views
0

Also Leute, dieser ist wahrscheinlich eine einfach beantwortete Frage. Bei der Arbeit mit eloquentem Javascript stieß ich auf ein Beispiel, in dem er den neuen Konstruktor Function verwendet. Ich wollte versuchen, diesen Konstruktor mit meiner eigenen Funktion createWithEval zurückzuentwickeln, indem Sie die Funktion eval() verwenden. Meine Funktion hat einen Namen, einen arg und einen body Parameter, die alle Strings sind.Eval innerhalb einer Funktion

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)) 

Der obige Code erstellt die xtimesy wie beabsichtigt funktionieren, aber wenn ich versuche, die eval-Anweisung innerhalb der Funktion zu setzen, die Funktion erscheint nicht definiert, wenn erklärt

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 

Ich glaube, ich einen Umfang haben Fehler oder falsches Verständnis der Funktionsweise der Eval-Funktion. Irgendwelche Eingaben und/oder Lösungen sind willkommen.

+0

Wenn 'createWithEval' würde * Rückkehr * die Funktion, dann werden Sie schreiben müssen' var xtimesy = createWithEval („xtimesy“ , "x, y", "return x * y"); 'um es aufrufbar zu machen – Bergi

+0

möglich duplizieren von [Eval eine Zeichenfolge zu einer aufrufbaren JS-Funktion] (https://stackoverflow.com/a/17792406/1048572)? – Bergi

Antwort

-1

Das Problem ist, dass Sie eval innerhalb der createWithEval-Funktion ausführen, und es ist daher nicht außerhalb des Bereichs createWithEval verfügbar. Eine Möglichkeit, dies zu korrigieren wäre eval.apply(window,[bdy]) zu verwenden eval auf dem globalen Bereich zu laufen:

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' ändert nichts. – Bergi

+0

Uh, tut mir leid, ich hätte es klar sagen sollen: * Die Verwendung von 'apply' * an sich ändert etwas, aber zu denken, dass der Empfängerkontext von Bedeutung ist [ist sehr falsch] (http://perfectionkills.com/global-eval-what) -sind die Optionen/# windoweval). Übergeben Sie nicht 'this' oder' window' oder irgendetwas - es spielt keine Rolle. Verwenden Sie einfach "eval.call (null, bdy)" oder "(1, eval) (bdy)". – Bergi

Verwandte Themen