我有两个脚本,但我无法访问其中一个脚本。如何编辑函数的内容而不重写它?
示例:
我知道这可以编辑功能:
<script>
function a() {
alert('hi');
}
</script>
<script>
function a() {
alert('hi');
console.log('hi');
}
</script>
但我不想再次重写&#34;警告(&#39; hi&#39;)&#34;。
答案 0 :(得分:3)
您可以窃取函数的符号,如下所示:
var b = a; // <== Takes the original `a` and remembers it as `b`
a = function() { // <== Assigns a new function to `a`
var rv = b(); // <== Calls what used to be `a`, remembers its return value
console.log("hi");
return rv; // <== Returns what the old function returned
};
当然,如果你不需要返回值的东西,你可以把它留下来,但如果你假装是旧函数,最好还是返回它返回的内容。
如果你需要传递参数并且只想传递新函数接收的所有参数,你可以使用Function#apply
和特殊{{1}伪数组:
arguments
答案 1 :(得分:0)
试试这个:设置旧功能,然后重新分配旧功能:
function a() {
alert('hi');
}
b = a;
a = function()
{
b();
console.log('hi');
}
a();
请注意,您必须使用表达式分配新的a
:a = function()...
如果只执行function a()...
,则会得到递归并超过最大调用堆栈大小。
答案 2 :(得分:0)
另一个选择是通过搜索&amp;重新定义功能源。替换:
eval(a.toString().replace(/(alert\(\'hi\'\)\;)/,"$1\nconsole.log('hi');"));
答案 3 :(得分:0)
您可以将原始函数序列化为字符串,构造一个新函数并将新行附加到其中:
function a() {
alert('a');
}
var b = new Function('(' + a + ")(); alert('b');")
b(); // would alert twice, 'a' & 'b'