Accès à la fermeture d'une fonction JavaScript
En JavaScript, une fonction forme une fermeture en conservant un lien caché vers sa portée englobante. Cela permet à la fonction d'accéder aux variables et autres ressources définies dans cette portée, même après la fin de la portée. Mais est-il possible d'accéder à cette fermeture par programme ?
Considérons l'exemple suivant :
<code class="js">var x = (function() { var y = 5; return function() { alert(y); }; })();</code>
Dans ce cas, nous définissons une fonction x qui renvoie une autre fonction avec accès à une variable privée y . L'objectif est d'accéder par programmation à cette fermeture et d'inspecter ses propriétés.
Obtenir l'accès à la fermeture
L'accès à la fermeture d'une fonction n'est pas directement possible en JavaScript standard. Cependant, il existe des techniques qui peuvent nous aider à y parvenir dans certains environnements :
Environnements front-end :
Dans les environnements Web front-end, nous pouvons utiliser un MutationObserver . En observant le DOM pour la balise de script qui contient notre fonction, nous pouvons modifier son code une fois inséré dans le document. Cela nous permet d'exposer la fermeture ou de modifier son contenu.
Considérons l'exemple suivant :
<code class="js">new MutationObserver((mutations, observer) => { // Find the target script tag const tamperTarget = document.querySelector('script + script'); if (!tamperTarget) { return; } // Modify the target script's code observer.disconnect(); console.log('Tampering with target script'); tamperTarget.textContent = tamperTarget.textContent.replace( 'return function', 'window.y = y; return function' ); }).observe(document.body, { childList: true });</code>
Cet observateur modifiera le script cible pour exposer la variable y en tant que variable globale. On peut alors accéder à cette variable depuis le rappel de l'observateur :
<code class="js">setTimeout(() => { console.log("Hacked into tamper target's script and found a y of", y); });</code>
Limitations :
Il est important de noter que ces techniques sont expérimentales et peuvent ne pas fonctionner dans tous les cas ou des environnements. Ils reposent sur un timing et un accès spécifiques au code sous-jacent, qui peuvent varier selon les navigateurs et les scénarios.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!