Javascript闭包和事后函数处理程序

时间:2012-03-26 16:43:39

标签: javascript loops closures

关于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

我的问题是:还有其他方法可以做类似的事吗?我不是在谈论被引用问题的另一个答案所给出的呼叫者功能。这是一个很好的。但我只是试图找到一种与上述答案相同的方法。非常感谢。

1 个答案:

答案 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);
   }

})();