Javascript 在运行时将代码插入函数体

Javascript 在运行时将代码插入函数体,javascript,code-injection,Javascript,Code Injection,我来自Java,有字节码编辑经验,我想知道是否可以在运行时用Javascript更改函数体 对于这个问题,让我们使用以下代码作为示例: function myFunction(paramA, paramB) { console.log('a', paramA); console.log('b', paramB); } 在运行时,我希望能够将主体更改为: function myFunction(paramA, paramB) { console.log('a', par

我来自Java,有字节码编辑经验,我想知道是否可以在运行时用Javascript更改函数体

对于这个问题,让我们使用以下代码作为示例:

function myFunction(paramA, paramB) {
    console.log('a', paramA);

    console.log('b', paramB);
}
在运行时,我希望能够将主体更改为:

function myFunction(paramA, paramB) {
    console.log('a', paramA);
    console.log('hello inserted world');
    console.log('b', paramB);
}
如果这是可能的,我知道它会增加代码库的复杂性。因此,如果可能的话,应该避免在团队项目中,或者最终有人接手,但这不是现在的问题

真正的问题是,这是可能的还是可以近似的,人们会怎么做?我不是在找代码示例,伪代码就足够了

一些要求/规则/注释:

该示例包含函数声明,但是也可以接受函数表达式。 该功能可能被完全覆盖;现有引用可能会丢失。 整个应用程序将被缩小,答案应该说明这一点。 插入的代码必须在第一个console.log之后插入,而不管正文中是否有任何其他代码。 该函数必须可通过MyFunction,b执行。
你可以用它来实现这一点,但它通常被认为是邪恶的,所以要小心

eval可以对作为字符串传递给它的代码进行求值-非常危险

您可以将myFunction更改为只执行eval并传递您想要的任何内容

function myFunction(a,b,evil) {
  eval(evil); //do whatever you want with a, b and evil.
}

您必须用上述声明覆盖myfuncta,b。

我想这取决于代码的来源。JavaScript的声明总是存在的,但由于存在安全漏洞的可能性,通常会强烈反对。请参阅。

更改函数,以便可以使用原型


这可能不会坚持您想要的方式,但这是真正的JS方式。你真的不应该用eval之类的。这是面向对象的js

var ov = {};

//the function
var myFunction = function(paramA, paramB) {
    console.log('a', paramA);
    console.log('b', paramB);
};

//Add something to the function
var dispatch = function(object, method, args){
 method.apply(object, args);
 //do whatever you want beneath this line
 console.log('hello inserted world'); 
};

dispatch(ov, myFunction, ["pa", "pb"]);
我们在这里做的是创建一个空对象。将这两个参数实际实现到对象中可能是有意义的,但这是另一回事。 我们正在创建一个函数myFunction和一个dispatcher,并通过apply调用dispatcher函数中的函数。
之后,我们可以添加任意数量的代码。我们现在能够在ov的范围内执行分派功能。我们通过数组传递参数

将函数更改为字符串,插入字符串,然后编译/计算回函数。但是对于一个字符串,我必须自己识别行尾,如果源代码被缩小,这可能会很困难,我将把它添加到OP中now@SDjs允许重写函数。它还允许以字符串形式检索函数。Eval只是将一个字符串计算为js。object.prop和object['prop']是同一个东西,所以请您停止使用Eval,谢谢;即使对于数组,对象属性也始终是字符串;为…做什么是为了什么不是为了什么@StephanBijzitter行结束符不应作为目标,如果缩小,指令终止符将是有效的目标;如果注入只针对console.log调用,您可以按照以下方式工作:1。console.log=函数{/*无论什么*/};。向函数体添加检测调用站点所需的所有逻辑+要注入的代码。2.删除console.log;。还原原来的console.log,哈哈很有创意,但是console.log只是一个例子,在现实世界中没有任何用处。除此之外,这涉及到准备原始函数,如果这样做,为什么不自己添加代码呢-当您的代码不会被缩微或者您知道缩微器的名称混乱方案时,该方法将泛化到myFunction调用。否则,它需要一个定义好的钩子,例如没有缩小的js运行时调用。在任何情况下,它都不涉及准备原始函数:您将要插入的代码移动到新的“console.log”中,并添加一些检查以确定何时执行它。。。。。。它是否可行取决于您需要的灵活性。您的解决方案将以错误的顺序生成输出,不是吗?”a’、‘pa’、‘b’、‘pb’、‘你好……’而不是‘a’、‘pa’、‘你好……’、‘b’、‘pb’,这是缺点=