几天前,我问了一个关于在外部脚本执行过程中动态修改函数代码的问题,我被告知完全忘记了这个概念。我不确定我明白为什么会这样。让我举个例子:
<script>
var display = function(msg)
{
alert(msg);
}
// Now, at the moment, the display() function
// is receiving a single parameter and alerting
// it to the user. I'm now going to use eval()
// to modify the display() function.
eval('display = ' + display.toString().replace('alert(', 'document.write('));
// Now, the display() function writes its parameter
// to the document as opposed to alerting it.
</script>
我意识到这是一个相当简单的例子,但肯定会有一些用法可以从动态修改函数中获得,这本身就是非常有用的。
答案 0 :(得分:8)
虽然这可能会做你需要它做的事情,但是从现在开始6个月你(或维护代码的人)将会“WTF?”。
如果您的用例是基于某些条件提醒或写入,为什么不写两个不同的功能?或者让您的函数采用另一个决定输出模式的参数。或者将函数作为执行实际输出的参数传递。你知道,在理智的一面,还有一些小。 ; - )
答案 1 :(得分:5)
在某些情况下,更改函数的行为可能会有用,但有更好的方法可以实现。在您的示例中,您可以通过将函数作为参数传递(类似于策略模式)来创建以不同方式处理输出的函数的新实例:
function makeDisplay(displayStrategy) {
return function(msg) {
// I'm assuming you would do some additional processing here...
displayStrategy(msg);
}
}
var display = makeDisplay(alert);
// now modify display to use document.write
display = makeDisplay(function(msg) { document.write(msg); });
答案 2 :(得分:0)
好吧,使用eval
可能是一个安全问题,但实时修改一个函数是可以的。你还能怎么做备忘录呢?
虽然,考虑到这一点,改变方法签名并不是一个好主意,其他人在此之后将不知道如何调用此函数,因为它将取决于执行顺序并且通常不容易跟踪。
答案 3 :(得分:0)
我发现自己需要在我没有特定供应商javascript的源代码的情况下这样做;这可能是一个合法的用例。我同意,如果你有其他选择,最好以更有条理的方式进行,编辑原始功能更灵活。