In JavaScript bilden Funktionen Abschlüsse, indem sie einen versteckten Link zu ihrem umschließenden Bereich beibehalten. Dies wirft die Frage auf: Ist es möglich, programmgesteuert auf diesen Abschluss zuzugreifen, wenn die Funktion als variabler Wert verfügbar ist?
Die primäre Motivation hinter dieser Untersuchung ist theoretischer Natur, aber eine praktische Anwendung könnte die Auflistung der Eigenschaften des Abschlusses umfassen . Betrachten Sie den folgenden Code:
<code class="js">var x = (function(){ var y = 5; return function() { alert(y); }; })(); //access y here with x somehow</code>
Das Ziel besteht darin, mit der Funktion x auf die Variable y zuzugreifen.
In Frontend-Umgebungen, in denen Sie ausführen können Wenn Sie Ihr JavaScript in einem vorherigen Skript-Tag einfügen möchten, besteht eine Möglichkeit darin, einen MutationObserver anzuhängen. Dieser Beobachter wartet darauf, dass das Skript-Tag, das Sie untersuchen möchten (in diesem Fall x), in das Dokument eingefügt wird, und ändert seinen Code, um die gewünschte Funktionalität verfügbar zu machen.
Zum Beispiel:
<code class="js">new MutationObserver((mutations, observer) => { // Find the target script tag const tamperTarget = document.querySelector('script + script'); if (!tamperTarget) { return; } observer.disconnect(); console.log('Target script getting tampered with'); // Modify the script's content to expose the closure tamperTarget.textContent = tamperTarget.textContent.replace( 'return function', 'window.y = y; return function' ); setTimeout(() => { console.log("Hacked into tamper target's script and found a y of", y); console.log('Could also have replaced the local y with another value'); }); }) .observe(document.body, { childList: true });</code>
Dieses Skript hängt den Beobachter an den document.body an. Wenn das Skript-Tag mit der x-Funktion eingefügt wird, löst der Beobachter die Zeilenrückgabefunktion aus und ersetzt sie durch window.y = y; Rückgabefunktion. Dadurch wird die y-Variable als globale Variable (window.y) verfügbar gemacht.
Anschließend können Sie auf die y-Variable nach Bedarf zugreifen und sie bearbeiten. Diese Technik kann zum Debuggen, Testen und Experimentieren mit Abschlüssen nützlich sein.
Das obige ist der detaillierte Inhalt vonKönnen Sie in JavaScript programmgesteuert auf den Abschluss einer Funktion zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!