1

現在、ある時点でJavascriptをテキストエリアに入力して実行できるようにするプロジェクトに取り組んでいます。ページを監視し、サーバー データに送信する多くのバックグラウンド コードがあります。これらはすべてプライベート関数に含まれているため、コンソールを使用して単純に侵入することはできません。唯一の問題は、テキストエリアに入力されたコードが、サーバー関数を含むプライベート関数内で評価されるため、サイトの内部にアクセスできることです。どうすればそれを分離して、スコープがプライベート関数の外になるようにすることができますか? 以下に例を示します。

<script>

var x = 2;
(function(){
    var x = 10;
    var elem = document.createElement('button');
    elem.addEventListener('click',function(){
        alert(x);
    });
    document.body.appendChild(elem);
})();

</script>

この例では、ボタンが押されたときに x が 10 ではなく 2 を返すようにします。したがって、グローバル スコープ内にあるかのように強制的に実行されます。

編集

正しい道を進んでいるように見えるウィンドウに関数をバインドしようとしましたが、探していた効果はありませんでした。

<script>

var x = 2;
(function(){
    var x = 10;
    var elem = document.createElement('button');
    elem.addEventListener('click',(function(){
        alert(x);
    }).bind(window));
    document.body.appendChild(elem);
})();

</script>

ウィンドウを関数に適用しようとしましたが、残念ながらそれもうまくいきませんでした。

4

2 に答える 2

0

結局のところ、答えは私が持っていたよりもはるかに簡単でした. グローバル スコープ内にあり、クローズド関数の外にある関数は、任意の関数から呼び出すことができますが、グローバル スコープ内の変数にしかアクセスできません。したがって、以下の例は完全に機能します。

<script>

var run = function(){alert(x);};
var x = 2;
(function(){
    var x = 10;
    var elem = document.createElement('button');
    elem.addEventListener('click',run);
    document.body.appendChild(elem);
})();

</script>
于 2013-02-03T16:58:58.573 に答える
0

編集したバージョンで、alert(x) を alert( this .x) に変更します。それはあなたの問題を解決しますか?

于 2013-02-03T16:06:37.377 に答える