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

Insert code into body of function at runtime

本文关键字:插入 函数体 代码 运行时      更新时间:2023-09-26
来自

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(a, b) 执行。
我想

这取决于代码的来源。 总是有JavaScript的eval()语句,但由于可能存在安全漏洞,它通常(非常)不鼓励。 请参阅此文章。

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

http://www.w3schools.com/js/js_object_prototypes.asp

你可以

eval来实现这一点,但它通常被认为是"邪恶的",所以要小心。

eval可以评估作为字符串传递给它的代码 - 非常危险。

您可以将myFunction更改为简单地执行eval并传递所需的任何内容。

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

您必须使用上述声明覆盖myFunction(a,b)

这可能不会坚持你想要的方式,但这是"真正的"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"和一个调度程序,并在调度程序函数中调用该函数(通过"apply")。之后,我们可以根据需要添加代码。我们现在能够在 ov 的作用域中执行调度函数。我们通过数组传递参数。