如何重载任何函数的调用过程?
在我的网络应用程序中,我希望在调用函数之前执行某些操作,之后我会怎样才能执行此操作而无需对调用方法进行原型设计(因为我尝试了这一点,只有当我将函数调用为{{ 1}})仍然具有请求的效果。
我已经尝试了一切使其工作,但没有任何作用,并且以艰难的方式(通过调用方法)这样做是不可行的,因为我将不得不重写我的所有代码。
有人可以帮忙吗?
答案 0 :(得分:3)
您可以手动更改每个功能定义 您可以手动更改每个功能调用 如果这些重构中的任何一个超出了你的问题范围,那么你就会陷入困境。
我不熟悉解决问题的通用方法。
但是,如果您的函数是全局可访问或命名空间的,那么您可以非常轻松地执行以下操作(并且可以通过参数化pre
和post
函数等使其更加通用。)
NS = {
foo : function(){ console.log('foo'); },
bar : function(){ console.log('bar'); }
};
// <-- new code goes here
NS.foo();
NS.bar();
// new code below, that should go after definitions but before the calls
(function(){
var pre = function(){ console.log('pre'); },
post = function(){ console.log('post'); };
for (var fn in NS) {
NS[fn] = (function(fn){ return function(){ pre(); fn(); post(); }; })(fn);
}
})();
答案 1 :(得分:3)
您可以创建一个调用函数,接受函数名,参数和上下文作为参数:
function pre() {
alert("I'm before the call");
}
function post() {
alert("I'm after the call");
}
function caller(func, parameters, context) {
pre();
func.apply(context, func, parameters.split(','));
post();
}
或者在Calling dynamic function with dynamic parameters in Javascript上使用可以这样调用caller(funcName, param1, param2);
的AnthonyWJones解决方案:
function caller(func){
pre();
this[func].apply(this, Array.prototype.slice.call(arguments, 1));
post();
}