関数のクロージャへのアクセス
クロージャは、それを囲むスコープへのリンクを形成し、そこから変数にアクセスできるようにする関数です。関数の実行後もそのスコープは保持されます。 JavaScript では、このクロージャは隠されているため、プログラムからそのプロパティにアクセスすることが困難になります。
関数のクロージャにアクセスできますか?
答えは「はい」です。いくつかの型破りな方法が必要です。 1 つのアプローチは、フロントエンド環境で MutationObserver を利用することです。この手法には、ドキュメントに挿入されたスクリプト タグのソース コードを変更して、調べたい機能を公開することが含まれます。
提供されている例は、このアプローチを示しています。新しいスクリプト タグの挿入を監視する MutationObserver を作成します。挿入されると、スクリプトのコードの一部が置き換えられて、内部変数とその値が公開されます。
<code class="js">new MutationObserver((mutations, observer) => { // Find the script tag to tamper with const tamperTarget = document.querySelector('script + script'); if (!tamperTarget) { return; } observer.disconnect(); tamperTarget.textContent = tamperTarget.textContent.replace( 'return function', 'window.y = y; return function' ); }).observe(document.body, { childList: true });</code>
調査するスクリプト タグ内で、クロージャは変数 x を介してアクセスされます。スクリプトのコードを変更すると、変数 y をクロージャからグローバル変数に公開して、そのプロパティを検査できるようになります。
<code class="js">var x = (function(){ var y = 5; return function() { alert(y); }; })(); // Access y here with x somehow console.log(window.y); // 5</code>
この手法は、クロージャのプロパティにアクセスして検査する方法を提供します。関数のスコープ内に隠されている場合でも。
以上がJavaScript で関数のクローズにアクセスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。