2017-02-03 3 views
0

J'essaie d'écrire un chargeur JavaScript pour un projet à moi pour NW.js (node-webkit). Je connais déjà un peu peg.js et estools (esprima/escodegen), donc l'analyse des modules JavaScript dans les différentes déclarations de fonctions et de variables n'est vraiment pas un problème, le problème que j'ai est d'instancier les différentes expressions et déclarations textuelles dans un contexte/objet séparé.Créer des classes à partir de texte en JavaScript

eval() ne semble pas fonctionner pour transformer une chaîne de déclaration en une variable de mon choix.

$.context.fn = eval("function anonymous(a,b,c){ return a+b+c; }"); 

//$.context.fn = undefined.. 

La seule chose que je peux convertir avec succès à partir du texte à la variable est fonction:

$.context.fn = new Function('a','b','c','return a+b+c;'); 

//$.context.fn = function(a,b,c){ ... } 

Mais il ne semble pas être une façon analogue d'aller à transformer une chaîne en une classe par exemple :

$.context.cl = new Class(params,body) ??? 

//error 

question:

Y at-il peut-être une sorte de bibliothèque de chargeur que je pourrais utiliser pour cela ou y a-t-il peut-être quelques conseils pour que tout fonctionne avec eval() après tout?

Répondre

-1

Vous pouvez créer des fonctions avec eval:

1)

eval("function anonymous(a,b,c){ return a+b+c; }"); 
console.log(anonymous(1,2,3)); 

2)

eval('var fn = function(a,b,c) { return a+b+c;};'); 
console.log(fn(1,2,3)); 

3)

eval("function anonymous(a,b,c){ return a+b+c; }"); 
var fn = anonymous; 
console.log(fn(1,2,3)); 
1

Votre problème est que

function anonymous(a,b,c){ return a+b+c; } 

est une déclaration de fonctions, pas une expression de fonction. La déclaration de fonction ne renvoie rien: ils définissent une nouvelle fonction avec le nom fourni. Dans ce cas, le nom est anonymous.

Vous souhaitez utiliser une expression de fonction à la place. See this MDN section for an explanation of the differences. Vous pouvez faire une expression de fonction en enveloppant la fonction entre parenthèses:

$.context.fn = eval("(function anonymous(a,b,c){ return a+b+c; })"); 

Class declarations et class expressions fonctionnent de la même façon:

$.context.cls = eval("(class MyArray extends Array {})") 
2

eval devrait fonctionner correctement avec toutes les expressions:

$.context.fn = eval("(function anonymous(a,b,c){ return a+b+c; })"); 
$.context.cl = eval("(class { constructor() { … } … })"); 

Cependant, eval alwa ys capture la portée locale, que vous ne voudrez probablement pas. Allez soit global eval, soit utilisez l'astuce avec le constructeur de la fonction pour obtenir la portée que vous voulez. Pour instancier une classe, créez simplement une fonction qui renvoie cette classe (ou toute autre construction de langage):

$.context.fn = (new Function("function named(a,b,c){ return a+b+c; }\nreturn named;"))(); 
$.context.cl = (new Function("class Example { constructor() { … } … }\nreturn Example;"))();