11

javascriptの関数は、それを囲むスコープへの(非表示の)リンクを保持することによってクロージャを形成します。

関数(変数値として)がある場合、プログラムでアクセスすることはできますか?

本当の目標は理論的ですが、デモンストレーションはクロージャーのプロパティをリストすることかもしれません。

var x = (function(){
   var y = 5;
   return function() {
       alert(y);
   };
})();

//access y here with x somehow
4

4 に答える 4

4

それが閉鎖の目的(の1つ)であり、情報を非公開にすることです。関数はすでに実行されているため、そのスコープ変数は外部から利用できなくなります(そして、一度も使用されたことはありません)。そのスコープで実行された関数のみが(まだ)アクセスできます。

ただし、ゲッター/セッターを介してアクセスを許可することはできます。

スチュワート・ラングリッジの閉鎖についての話を見てみたいと思うかもしれません。DouglasCrockfordsの説明も非常にお勧めです。あなたはクロージャーでたくさんの凝ったことをすることができます;)

編集:クロージャーを調べるためのいくつかのオプションがあります:webdeveloperコンソールでオブジェクトを監視するか、(私がよく行うように)すべてのプライベート変数をコンソールにダンプするデバッグ関数を返します。

于 2012-06-25T16:04:09.773 に答える
3

いいえ、公開しない限り、そうではありません。

var x = function(){
        var y = 5;

        return {             
           getY: function(){
              return y;
          },
          setY: function(newY){
             y = newY;
          }    
       }
   }


    x.setY(4);
于 2012-06-25T16:06:32.860 に答える
2

アラート機能を編集できます。

var x = (function(){
   var y = 5;
   return function() {
       alert(y);
   };
})();

var oldAlert = alert;

alert = function (x) {
    oldAlert(x);
    window.y = x;
}

x();

console.log(y); // 5

または、コードを所有している場合は、標準のゲッターとセッターを使用できます。

于 2012-06-25T16:08:58.867 に答える
2

フロントエンド環境にいて、以前のスクリプトタグで独自のJavascriptを実行できる場合は、MutationObserverをアタッチし、スパイしたいスクリプトタグがドキュメントに挿入されるのを待つというオプションがあります。挿入されたらすぐにコードを変更して、調べたり変更したりする機能が公開されるようにします。次に例を示します。

<script>
new MutationObserver((mutations, observer) => {
  // Find whether the script tag you want to tamper with exists
  // If you can't predictably identify its location,
  // you may have to iterate through the mutations' addedNodes
  const tamperTarget = document.querySelector('script + script');
  if (!tamperTarget) {
    return;
  }
  observer.disconnect();
  console.log('Target script getting tampered with');
  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 });

</script>

<script>
console.log('Tamper target script running');
var x = (function(){
   var y = 5;
   return function() {
       alert(y);
   };
})();
</script>

これはあなたが考えていたものではなかったかもしれませんが、この種の方法はクロージャーをハックする数少ない方法の1つであり、ページが変更できないコードを実行するときに便利な手法です。

他のスクリプトsrcにインラインコードの代わりにある場合、それは少し難しくなります。<script>タグがMutationObserverに表示されたら、タグを微調整するかtextContent、元のスクリプトの内容と変更を加えた新しいスクリプトタグに置き換えます。元のコンテンツを取得するには、組み込みを調べて<script>その置換をハードコーディングするか、必要な置換を行う前にスクリプトタグのテキストをフェッチする(CORSの問題を回避するために別のサーバーからリクエストをバウンスする可能性があります)。パッチを適用したコードを挿入します。(または、サーバーがある場合は、サーバーにテキストの置換を行わせることができます。その場合、必要なのsrcは、挿入されたスクリプトタグのを、デフォルトの場所ではなくサーバーを指すように変更することだけです。)

于 2019-12-20T11:09:06.737 に答える