JavaScript では、関数は、それを囲んでいるスコープへの隠しリンクを保持することによってクロージャを形成します。ここで疑問が生じます: 関数が変数値として利用可能な場合、このクロージャにプログラム的にアクセスすることは可能ですか?
この調査の背後にある主な動機は理論的ですが、実際のアプリケーションにはクロージャのプロパティのリストが含まれる可能性があります。 。次のコードを考えてみましょう。
<code class="js">var x = (function(){ var y = 5; return function() { alert(y); }; })(); //access y here with x somehow</code>
目的は、関数 x を使用して変数 y にアクセスすることです。
フロントエンド環境では、実行できます。前の script タグに JavaScript を追加する場合、1 つの方法は MutationObserver をアタッチすることです。このオブザーバーは、調べたいスクリプト タグ (この場合は x) がドキュメントに挿入されるのを待ち、そのコードを変更して目的の機能を公開します。
例:
<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>
このスクリプトはオブザーバーを document.body にアタッチします。 x 関数を含むスクリプト タグが挿入されると、オブザーバーがトリガーし、改行関数を window.y = y に置き換えます。リターン関数。これにより、y 変数がグローバル変数 (window.y) として公開されます。
その後、必要に応じて y 変数にアクセスして操作できるようになります。この手法は、クロージャのデバッグ、テスト、実験に役立ちます。
以上がJavaScript で関数のクロージャにプログラム的にアクセスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。