如何编辑函数而不重写其内容?

时间:2014-08-31 17:40:25

标签: javascript

我有两个脚本,但我无法访问其中一个脚本。如何编辑函数的内容而不重写它?

示例:

我知道这可以编辑功能:

<script>
function a() {
alert('hi');
}
</script>
<script>
function a() {
alert('hi');
console.log('hi');
}
</script>

但我不想再次重写&#34;警告(&#39; hi&#39;)&#34;。

4 个答案:

答案 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();

请注意,您必须使用表达式分配新的aa = 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'