【问题标题】:Javascript closure and pre post function handlersJavascript 闭包和 pre post 函数处理程序
【发布时间】:2012-03-26 16:43:38
【问题描述】:

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

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

【问题讨论】:

    标签: javascript loops closures


    【解决方案1】:

    你没有将函数传递给匿名块,你只是传递了持有它的属性的名称。通过整个功能,它应该可以工作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);
       }
    
    })();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2017-10-16
      相关资源
      最近更新 更多