javascript:在闭包范围内调用函数

时间:2012-10-18 18:08:11

标签: javascript

有没有什么办法可以覆盖一个闭包,所以它可以完成原始闭包的部分工作?我知道没有直截了当的方式,但有一些黑客攻击吗?我愿意变得凌乱......

<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 个答案:

答案 0 :(得分:1)

我认为您可以使用jQuery获取脚本标记的内容,之后您可以使用eval查看此question

答案 1 :(得分:1)

当您将代码放入此内容时:

(function() {

})();

它被称为自调用函数,并创建一个您无法访问的范围(就像无法在其他任何地方访问函数的范围...仅在其内部) - 它一旦运行就会运行声明。您可以致电window.K.doit的事实是因为代码扩展 全局 window对象。由于您可以随处访问window,因此可以调用它,但只能使用window.K.doitK.doit。这就是jQuery插件通常定义的方式 - 它们扩展了全局jQuery对象,而不直接暴露任何代码。 Sooooo不,你无法访问它,除非你做了其他回答者提出的建议 - 但要小心使用eval,因为技术上,任何脚本都可以插入,你可以“假设”它是正确/可信的并评估它。

答案 2 :(得分: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的副本,而不是原始副本。

答案 3 :(得分:-1)

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