Закрытие Javascript и обработчики функций перед публикацией - PullRequest
0 голосов
/ 26 марта 2012

По поводу вопроса о SO Как перегрузить процесс вызова любой функции . Принятый ответ на самом деле не работает как есть. Проблема заключается в том, что переданная переменная "fn" является строкой, а не функцией. Но если бы я изменил fn () на NS [fn] (), это создаст бесконечный цикл. Другой способ - использовать переменную внутри цикла for для отслеживания старых значений 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 Ответ

2 голосов
/ 26 марта 2012

Вы не передавали функцию в анонимный блок, вы просто передавали имя свойства, содержащего ее. Передайте всю функцию, и она должна работать 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);
   }

})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...