ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript で関数のクロージャにプログラム的にアクセスできますか?

JavaScript で関数のクロージャにプログラム的にアクセスできますか?

Patricia Arquette
リリース: 2024-10-29 22:10:03
オリジナル
952 人が閲覧しました

Can You Access a Function's Closure Programmatically in JavaScript?

関数のクロージャへのアクセス

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート