9
votes

Résolution des références de portée extérieure dans une fonction JavaScript pour la sérialisation

dbClient.filter(modifiedFunction, ...functionArgs).then(matches => ...)

10 commentaires

La plupart du temps, ces variables sont modifiées au moment de l'exécution, de telles conversions modifieraient le comportement du code.


Deux commentaires: une fois, cela est hors tension pour débordement de pile car il demande une bibliothèque. Deuxièmement, ce n'est pas la manière dont le scoping fonctionne dans JavaScript, et c'est pourquoi cela ne fonctionne pas pour vous. Comme cela ne fonctionne pas de cette manière, comment une technique pourrait-elle prédire correctement comment prendre cette décision? Cela rend à son tour la question à large pour débordement de pile.


J'ai modifié la question. Que diriez-vous d'utiliser Ast?


Bien sûr, cela pourrait fonctionner. Si vous aviez essayé une approche ast et rencontrez une difficulté, cela aurait rendu la question sur le sujet. Comme il se trouve toujours, c'est hors sujet.


Maintenant, je pense que la question est correcte


Je pense que la réponse est "non, il n'y a pas une telle technique".


Avec un arbre de syntaxe abstrait, vous obtiendrez la valeur de la variable de portée extérieure au moment de l'analyse. Les valeurs de temps d'exécution sont une question différente. Je suis d'accord, ce n'est pas possible. Des fonctions Serializing / Exportation qui dépendent des variables de portée extérieure sont un exercice de futilité. Je sens un problème xy. Qu'essayez-vous d'atteindre?


Je suis sérialisé une fonction de filtre à partir d'un numéro d'exécution de nœud à un runtime PostgreSQL Plv8. À l'heure actuelle, la fonction de filtre a une interface: dbclient.filter ((rangée, âge) => rangée.age> âge), agefromouterscope) .Ce (matchs => ...). Je veux une interface dbclient.filter ((rangée) => rangée.age> Âge)). Ensuite (matchs => ...), où l'âge est une référence de la portée extérieure.


Connexes:

3 Réponses :


0
votes

J'ai couru votre top Codebox's Foo via le compilateur de fermeture de Google, et cela m'a donné ceci:

var foo=function(){return function(){console.log("bar")}}();foo;


0 commentaires

0
votes

Vous pouvez lier le X à l'objet de la fonction elle-même.

p>

"Faux">
var foo = (function(){
  var x = "bar";
  return function(){
    this.x = x;
    console.log(this.x);
  };
})();

(foo)() // 'bar'

console.log(foo.toString()); // 'function() { this.x = x; console.log(this.x) }'

eval('(' + foo.toString()+')()'); // 'bar' 


1 commentaires

Lorsque vous faites (foo) () , le x va être joint à l'objet à cause de this.x =. x . C'est la raison pour laquelle il fonctionne toujours lorsque vous appelez Eval avec foo.tostring (), car x a une valeur de "bar" déjà préréglée. Si vous essayez d'exécuter l'EVAL dans une autre portée globale, cela échouera



1
votes

Pour exposer la variable privée en dehors de la portée, vous avez besoin d'une autre fonction dans la portée qui réécrit la description de la méthode renvoyée par Tostring. Ensuite, vous utilisez cette fonction au lieu de totring pour récupérer la description de la méthode.

var foo = (function(){
  var x = "bar";

  var f = function(){
    console.log(x);
  };

  f.decl = function() {
      return f.toString().replace("(x)", "(\""+x+"\")");
  }

  return f;

})();

console.log(foo.decl()); // function() {console.log("bar");}

eval("("+foo.decl()+")()"); // bar


0 commentaires