来自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)
执行。答案 0 :(得分:0)
您可以通过eval
实现这一目标,但它通常被认为是" 邪恶"所以要小心。
eval
可以评估更改传递给它的代码作为字符串 - 非常危险。
您可以更改myFunction
以简单地执行eval
并传递您想要的任何内容。
function myFunction(a,b,evil) {
eval(evil); //do whatever you want with a, b and evil.
}
您必须使用上述声明覆盖myFunction(a,b)
。
答案 1 :(得分:0)
我想这取决于代码的来源。总是存在JavaScript的eval()声明,但由于存在安全漏洞的可能性,通常会(非常)气馁。请参阅this article。
答案 2 :(得分:0)
更改功能以便您可以使用原型
答案 3 :(得分:0)
这可能不会影响你想去的方式,但这是真实的" 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的范围内执行调度功能。我们通过数组传递参数。