将代码附加到现有函数的末尾

Col*_*der 17 javascript eval

我需要在函数foo()触发时触发函数bar().我无法控制函数foo或将来是否会改变.我经常有这种情况(我讨厌它).

我写了这个函数来将我的代码添加到函数foo的末尾:

function appendToFunction(fn,code){ 
if(typeof fn == 'function'){
    var fnCode = fn.toString() ;
    fnCode = fnCode.replace(/\}$/,code+"\n}") ;
    window.eval(fnCode);                    // Global scope
    return true ;
}
else{
    return false ;
}
}
Run Code Online (Sandbox Code Playgroud)

例如:

appendToFunction(foo,"bar();");
Run Code Online (Sandbox Code Playgroud)

这对我来说是一个可怕的想法 - 但它确实有效.有人可以指出我更好(更安全)的方向.

编辑:foo不是一个特定的功能,但我最终处理的许多功能.它们不会在页面中动态更改.但它们可能会不时地改变(例如,形式验证要求).

解决方案:我选择了Adam的答案的修改版本.它并不完美,但它比我的更好:

var oldFoo = foo ;
foo = function(){
        var result = oldFoo.apply(this, arguments);
        bar();
        return result ;
}
Run Code Online (Sandbox Code Playgroud)

NB.注意IE6/7中没有.apply()方法的一些本机函数.

Ada*_*ath 31

您可以foo使用调用原始函数的自定义函数覆盖.

例如

var old_foo = foo;
foo = function() {
  old_foo();
  bar();
}
Run Code Online (Sandbox Code Playgroud)

您还应该foo通过替换函数传递任何参数.

  • 这个解决方案会导致我的堆栈溢出。如果您遇到同样的情况,下面的 xdazz 解决方案对我有用。 (2认同)

cuz*_*zea 6

function extend(fn,code){
  return function(){
    fn.apply(fn,arguments)
    code.apply(fn,argumnets)
  }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

function appendToFunction(fn,code){ 
    if(typeof fn == 'function'){
        var fnCode = fn.toString() ;
        fnCode = fnCode.replace(/\}$/,code+"\n}") ;
        window.eval(fnCode);                    // Global scope
        return true ;
    }
    else{
        return false ;
    }
}

appendToFunction = extend(appendToFunction,function(){/*some code*/});
Run Code Online (Sandbox Code Playgroud)

这将在两个函数中给你相同的"this"


xda*_*azz 6

你可以这样做:演示.

function foo() {
 console.log('foo');
}

function appendToFunction(fn, callback) {
  window[fn] = (function(fn){
    return function() {
      fn();
      callback();
    }
 }(window[fn]));
}

appendToFunction('foo', function(){console.log('appended!')});

foo();
Run Code Online (Sandbox Code Playgroud)