Подтвердить что ты не робот

Как получить все аргументы функции обратного вызова

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

// 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-фреймворки)

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Может ли быть так легко, как

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

?

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

Ответ 3

Разве это не такая тележка, ведущая лошадь?

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

Ответ 4

Вы даже можете сказать, какая функция args использует [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 перезаписывает ключевое слово аргументов с этой областью btw (как видно из журнала "argumentsX" ).