有没有什么办法可以覆盖一个闭包,所以它可以完成原始闭包的部分工作?我知道没有直截了当的方式,但有一些黑客攻击吗?我愿意变得凌乱......
<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>
答案 0 :(得分:1)
我认为您可以使用jQuery获取脚本标记的内容,之后您可以使用eval
查看此question。
答案 1 :(得分:1)
当您将代码放入此内容时:
(function() {
})();
它被称为自调用函数,并创建一个您无法访问的范围(就像无法在其他任何地方访问函数的范围...仅在其内部) - 它一旦运行就会运行声明。您可以致电window.K.doit
的事实是因为代码扩展 全局 window
对象。由于您可以随处访问window
,因此可以调用它,但只能使用window.K.doit
或K.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