Как получить все аргументы функции обратного вызова - PullRequest
21 голосов
/ 22 марта 2012

Очень часто я использую функцию обратного вызова, и у меня нет удобной документации, и было бы неплохо увидеть все аргументы, которые должны быть переданы этой функции обратного вызова.

// callback is a function that I don't know the args for...
// and lets say it was defined to be used like: callback(name, number, value)
something.doSomething( callback );

Как я могу определить, что является аргументом его перехода в это?

Примечание: просмотр исходного кода может быть бесполезным, когда сам код обфусцирован и минимизирован (как и многие js-фреймворки)

Ответы [ 4 ]

29 голосов
/ 22 марта 2012

Чтобы получить список аргументов без нарушения функциональности, перезапишите функцию обратного вызова следующим образом:

var original = callback;
callback = function() {
    // Do something with arguments:
    console.log(arguments);
    return original.apply(this, arguments);
};
  1. Контекст this сохраняется.
  2. Все аргументы переданы правильно.
  3. Возвращаемое значение правильно передано.

ПРИМЕЧАНИЕ. Этот метод работает в большинстве случаев. Хотя есть крайние случаи, когда этот метод потерпит неудачу, включая:

  • Свойства только для чтения (например, определенные с использованием Object.defineProperty с writable:false)
  • Свойства, которые определяются с помощью методов получения / установки, когда метод получения / установки не является симметричным.
  • Хост-объекты и API плагинов: например, Flash и ActiveX.
8 голосов
/ 22 марта 2012

Может ли это быть так просто, как

function callback() {
    console.log(arguments);
}

?

Каждая функция предоставляет аргументы, с которыми она вызывалась в автоматической коллекции arguments.

1 голос
/ 22 марта 2012

Разве это не та телега, которая ведет лошадь?

Ваша функция принимает обратный вызов. Это метод, использующий вашу функцию, который должен знать, какие аргументы должен принимать обратный вызов.

0 голосов
/ 26 марта 2013

Вы даже можете сказать ему, какие аргументы функции получить, используя [functionName] .arguments:

(function(arg1, arg2, agr3){
    console.log('args are:', arguments);
    return function fn(){
        function m(){
            console.log(
                'fn.arguments:', fn.arguments,
                'm.arguments:', m.arguments,
                'argumentsX:', arguments
            );
        };
        m('mArg1', 'mArg2', 'mArg3', 'mArg4');
    };
})
(1, 2, Math.PI)  // invoke closure
('fnArg1', 'fnArg2', 'fnArg3', 'fnArg4');  // invoke "fn"

Каждая функция def переписывает ключевое слово arguments, чтобы иметь эту область между прочим (как видно с помощью "argumentsX "бревно).

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