Мне нужно вызвать функцию bar(), когда срабатывает функция foo(). У меня нет контроля над функцией 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 ;
}
}
например:
appendToFunction(foo,"bar();");
Это поражает меня как ужасную идею, но она работает. Может ли кто-нибудь указать мне лучшее (безопасное) направление, пожалуйста.
EDIT: foo
- это не определенная функция, а множество функций, с которыми я сталкиваюсь. Они не изменяются динамически на странице. Но они могут время от времени меняться (например, требования к проверке формы).
Решение: Я остановился на модифицированной версии Adam Answer. Это не идеально, но это лучше, чем у меня:
var oldFoo = foo ;
foo = function(){
var result = oldFoo.apply(this, arguments);
bar();
return result ;
}
NB. Следите за некоторыми встроенными функциями в IE6/7, которые не имеют метода .apply()
.