【发布时间】:2015-03-11 10:25:34
【问题描述】:
来自 Java 并具有字节码编辑经验,我想知道是否可以在运行时使用 Javascript 更改函数体。
对于这个问题,我们以下面的代码为例:
function myFunction(paramA, paramB) {
console.log('a', paramA);
console.log('b', paramB);
}
在运行时,我希望能够将 body 更改为:
function myFunction(paramA, paramB) {
console.log('a', paramA);
console.log('hello inserted world');
console.log('b', paramB);
}
如果可能的话,我知道它将增加代码库的复杂性。因此,如果可能的话,应该避免在小组项目中(或者当有人最终必须接管时),但这不是现在的问题。
真正的问题是,这是否可能(或者可以近似)以及如何去做?我不是在寻找代码示例,伪就足够了!
一些要求/规则/注意事项:
- 该示例包含函数声明,但也可以使用函数表达式。
- 该函数可能被完全覆盖;现有的参考资料可能会丢失。
- 整个应用程序将被缩小,答案应该考虑到这一点。
- 插入的代码必须紧跟在第一个
console.log之后,不管正文中可能有也可能没有其他代码。 - 该函数必须可以通过
myFunction(a, b)执行。
【问题讨论】:
-
如果注入仅针对
console.log调用,您可以按照以下方式工作:1.console.log = function () { /* whatever */ };。将检测调用站点+要注入的代码所需的所有逻辑添加到函数体中。 2.delete console.log;。恢复原来的console.log, -
哈哈很有创意,但是因为console.log只是一个例子,在现实世界中是没有用的。除此之外,这涉及到准备原始函数,如果这样做,为什么不自己添加代码呢? ;-)
-
当您的代码不会被缩小或您知道缩小器的名称修饰方案时,该方法推广到
myFunction调用。否则它需要一个定义的钩子,例如。未缩小的 js 运行时调用。在任何情况下,它不涉及准备原始函数:您将要插入的代码移动到新的“console.log”中并添加一些检查以确定何时执行它... -
... 是否可行取决于您需要的灵活性。