JavaScript 関数のクロージャへのアクセス
JavaScript では、関数は、それを囲んでいるスコープへの隠しリンクを保持することによってクロージャを形成します。これにより、スコープが終了した後でも、関数はそのスコープ内で定義された変数やその他のリソースにアクセスできるようになります。しかし、このクロージャにプログラムでアクセスすることは可能でしょうか?
次の例を考えてみましょう:
<code class="js">var x = (function() { var y = 5; return function() { alert(y); }; })();</code>
この場合、プライベート変数 y にアクセスできる別の関数を返す関数 x を定義します。 。目標は、プログラムでこのクロージャにアクセスし、そのプロパティを検査することです。
クロージャへのアクセスの取得
標準 JavaScript では、関数のクロージャに直接アクセスすることはできません。ただし、特定の環境でこれを実現するのに役立つテクニックがあります:
フロントエンド環境:
フロントエンド Web 環境では、MutationObserver を使用できます。 。関数を含む script タグの DOM を観察することで、ドキュメントに挿入されたコードを変更できます。これにより、クロージャを公開したり、その内容を変更したりすることができます。
次の例を考えてみましょう:
<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>
このオブザーバーはターゲット スクリプトを変更して、変数 y をグローバル変数として公開します。その後、オブザーバーのコールバックからこの変数にアクセスできます:
<code class="js">setTimeout(() => { console.log("Hacked into tamper target's script and found a y of", y); });</code>
制限事項:
これらの手法は実験的なものであり、すべてのケースで機能するわけではないことに注意することが重要です。または環境。これらは特定のタイミングと基礎となるコードへのアクセスに依存しており、ブラウザーやシナリオによって異なる可能性があります。
以上がプログラムで JavaScript 関数のクローズにアクセスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。