关于SO How to overload the calling process of any function的问题。接受的答案实际上不是按原样运作的。问题在于传入的变量“fn”是一个字符串而不是一个函数。但是,如果我将fn()更改为NS [fn](),它将创建一个无限循环。另一种方法是在for循环中使用var来跟踪foo和bar的旧值,但由于闭包它也不会起作用。我最后添加了一个新数组来跟踪旧函数,如下所示:
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'); };
var temp = new Array();//Added line 1
for (var fn in NS) {
temp[fn] = NS[fn];//Added line 2
//original answer: NS[fn] = (function(fn){ return function(){ pre(); fn(); post(); }; })(fn);
NS[fn] = (function(fn){ return function(){ pre(); temp[fn](); post(); }; })(fn);
}
})();
NS.foo();//Added line 3
NS.bar();//Added line 4
我的问题是:还有其他方法可以做类似的事吗?我不是在谈论被引用问题的另一个答案所给出的呼叫者功能。这是一个很好的。但我只是试图找到一种与上述答案相同的方法。非常感谢。
答案 0 :(得分:2)
您没有将该函数传递给匿名块,您只是传递了持有它的属性的名称。传递整个函数,它应该工作http://jsfiddle.net/mendesjuan/bpq8j/
(function(){
var pre = function(){ console.log('pre'); },
post = function(){ console.log('post'); };
for (var propName in NS) {
NS[propName] = (function(fn){
return function(){
pre();
fn(); // could be fn.call(NS) if you need 'this'
post();
};
})(NS[propName]);
}
})();
我稍微改变了你的代码,将pre / post的想法抽象为一个函数。 http://jsfiddle.net/mendesjuan/bpq8j/1/
function addPrePost(fn, pre, post) {
return function() {
pre();
fn();
post();
}
}
(function(){
var pre = function(){ console.log('pre'); },
post = function(){ console.log('post'); };
for (var propName in NS) {
NS[propName] = addPrePost(NS[propName], pre, post);
}
})();