Lassen Sie uns sagen, dass wir eine Funktion haben, die wie folgt aussieht:Gibt es eine einfache Methode, eine globale Var in eine lokale Variable zu verwandeln?
const fn =() => x;
Diese Funktion sollte den Wert von x
zurück, wo x
im globalen Bereich zur Verfügung steht. Zunächst ist dies undefined
aber wenn wir x
definieren:
const x = 42;
Dann können wir fn
erwarten 42
zurückzukehren.
Jetzt wollen wir fn
als eine Zeichenfolge rendern. In JavaScript haben wir toString
für diesen Zweck. Lassen Sie uns jedoch auch sagen, dass wir schließlich fn
in einem neuen Kontext ausführen möchten (d. H. Unter Verwendung von eval
), und daher sollten alle von ihr verwendeten globalen Referenzen entweder vor oder während unseres Aufrufs an toString
verinnerlicht werden.
Wie können wir x
eine lokale Variable machen, deren Wert den globalen Wert von x
zu der Zeit widerspiegelt, die wir fn
in eine Zeichenfolge konvertieren? Angenommen, wir können nicht wissen x
heißt x
. Das heißt, wir können davon ausgehen, dass die Variablen in demselben Modul enthalten sind.
Wie 'fn.toString() => \ '(... args) => {const x = $ {JSON.stringify (window.x)} ; return $ {this.toString()} (... Argumente); } \ ';'? Oder wenn Sie nur den Rückgabewert der Funktion erfassen wollen: 'fn.toString =() => \'() => $ {JSON.stringify (this())} \ ';'. –
Wie viel Aufwand möchten Sie damit machen? Es ist einfach, wenn Sie wissen, welche Variablen erfasst werden sollen. Es ist auch einfach, wenn Sie nur die Ausgabe erfassen (wenn die Funktion keine Eingabe macht und keine Nebenwirkungen hat, dann reicht es aus). Wenn Sie die Funktion wirklich ausführen wollen, während Sie die Werte ihrer freien Variablen festlegen, aber Sie den Namen der freien Variablen nicht kennen, müssen Sie zuerst die Namen finden. Sie können dies tun, indem Sie die Zeichenfolgendarstellung der Funktion analysieren und ein Tool wie https://github.com/estools/escope verwenden, um freie Variablen zu finden. –
@FelixKling irgendwann wird es eine ordentliche Mühe wert sein. Vorläufig können wir die Variablen in einzelnen Funktionen duplizieren - das ist kein netter Ansatz, aber es tut, was wir brauchen. Natürlich, wenn es eine bessere Methode gibt, würden wir sie gerne einsetzen! – maxcountryman