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

时间:2015-03-11 10:25:34

标签: javascript code-injection

来自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)执行。

4 个答案:

答案 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)

更改功能以便您可以使用原型

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

答案 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的范围内执行调度功能。我们通过数组传递参数。