1

元のクロージャーが行うことの一部を実行するようにクロージャーをオーバーライドする方法はありますか?簡単な方法はありませんが、ハックはありますか?私は散らかっていても構わないと思っています...

<html>
    <head>

        // I DON'T CONTROL THIS CODE!!!
        <script>
        ;(function() {

            function _dothing() {
                alert("_dothing");
            }

            function _doit() {
                _dothing();
                alert("_doit");
            }

            window.K = { doit : _doit };

        })();
        </script>
    </head>
<body>

    // I DO CONTROL THIS CODE
    <script>

        function mydoit() {
            alert("mydoit");
            _dothing();         <-- THIS FAILS, IS THERE ANY WAY TO SUCCEED? :(
        }

        window.K.doit = mydoit;
        window.K.doit();
    </script>

</body>
</html>
4

4 に答える 4

1

次のようなことを試すことができます(これが非常に厄介なことは知っていますが、他の人が指摘したように、それが唯一の方法のようです):

function mydoit() {
    alert("mydoit");
    _dothing();
}

var f = new Function(document.scripts[0].text.replace(/(}\)\(\);\s*)$/, "window._dothing = _dothing;\n$1"));
f();
window.K.doit = mydoit;
window.K.doit();

Firefox、Chrome、IE8 でテスト済み。

注意: これは穴の新しいコンテキストを作成しています。既に作成されているものとは異なります。_dothingオリジナルではなく、単なるコピーを呼び出しています。

于 2012-10-18T20:07:42.013 に答える
1

I think you can use jQuery to get the content of the script tag and after that you can use eval see this question.

于 2012-10-18T18:14:50.977 に答える
1

この中にコードを入れると:

(function() {

})();

これは自己呼び出し関数と呼ばれ、アクセスできないスコープを作成します(関数のスコープに他の場所にアクセスできないのと同じように...その内部のみ)-宣言されるとすぐに実行されます。呼び出すことができるという事実window.K.doitは、コードがグローバルオブジェクトを拡張するためです。どこにでもアクセスできるので、呼び出すことができますが、またはでのみです。jQuery プラグインは通常、このように定義されます。コードを直接公開することなく、グローバル オブジェクトを拡張します。すっごくいいえ、他の回答者が提案するようなことをしない限り、アクセスできませんが、使用には注意してください windowwindowwindow.K.doitK.doitjQueryeval、技術的には、任意のスクリプトを挿入でき、それが正しい/信頼されていると「想定」して評価できます。

于 2012-10-18T18:18:13.340 に答える
-1

匿名/自己実行関数内からグローバル変数を作成する必要があります: このチュートリアルでは、その方法を説明します: http://professionalaspnet.com/archive/2012/07/29/Make-Your-JavaScript-Better-With-Self -実行中-匿名-Functions.aspx

于 2012-10-18T18:22:03.520 に答える