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

我认为您可以使用 jQuery 获取脚本标签的内容,然后您可以使用eval查看此问题

于 2012-10-18T18:14:50.977 回答
1

当您将代码放入其中时:

(function() {

})();

它被称为自调用函数,并创建一个您无法访问的范围(就像无法在其他任何地方访问函数的范围......仅在其中) - 它在声明后立即运行。您可以调用的事实window.K.doit是因为代码扩展全局 window对象。由于您可以访问window任何地方,因此可以调用它,但只能使用window.K.doitor K.doit。这就是 jQuery 插件通常的定义方式——它们扩展全局jQuery对象而不直接暴露任何代码。Sooooo 不,除非您执行其他回答者建议的操作,否则您无法访问它 - 但使用时要小心eval,从技术上讲,可以插入任何脚本,您可以“假设”它是正确的/受信任的并对其进行评估。

于 2012-10-18T18:18:13.340 回答
-1

您必须从匿名/自执行函数中创建一个全局变量:本教程将向您展示如何: http: //professionalaspnet.com/archive/2012/07/29/Make-Your-JavaScript-Better-With-Self -执行匿名函数.aspx

于 2012-10-18T18:22:03.520 回答