我需要在函数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通过替换函数传递任何参数.
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"
你可以这样做:演示.
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)