Considérez ce codeComment créer une nouvelle variable dans une fermeture
'use strict';
var factory =() => script => eval(script);
var closure = factory();
closure('var v = 0');
var val = closure('typeof v');
console.log(val);
Ceci est ma tentative pour y parvenir. Je veux créer une fermeture et ensuite permettre aux utilisateurs de créer une nouvelle variable locale dans cette fermeture. Est-ce que c'est possible?
J'ai lu quelque part que "la fonction native 'eval' peut même créer une nouvelle variable dans le contexte d'exécution locale.". Alors, pourquoi ça ne marche pas dans mon exemple? Ma conjecture est que c'est parce que la fonction a fini d'exécuter et le nombre de variables après la fin de la fonction ne peut pas être changé, mais je ne suis pas sûr.
Mon exemple de script crée une fermeture et essaie de déclarer et d'initialiser la nouvelle variable v
dans cette fermeture et lui affecter le numéro 0
. Je m'attendais à ce que le résultat de typeof v
devrait être number
, mais il est en réalité undefined
.
Donc, j'ai deux questions:
- Pourquoi ne pas crée la
v
variable comme prévu - Comment atteindre réellement que (ce serait l'exemple de travail)?
Que faites-vous exactement essaies de construire ici? Que diriez-vous de créer un objet pour stocker votre contexte et ajouter des propriétés à cet objet au lieu d'essayer de pirater des fermetures. – Thomas
Pourquoi avez-vous besoin de cela? J'ai une réponse à 75%, mais j'ai réalisé à quel point cela semblait étrange et inutile. Pourquoi avez-vous besoin de créer de nouvelles variables dans une portée comme celle-ci? Et notez que chaque fois que vous appelez 'closure', vous créez une nouvelle portée. Tous les appels à 'closure' ne sont pas" connectés ". – Carcigenicate
@Thomas. Je sais que je peux utiliser un objet à la place, mais je ne fais que demander cette méthode afin de mieux comprendre le fonctionnement de javascript. –