Обратные вызовы Javascript и необязательные параметры

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

Пример:

сохранение функции (цвет, размер, вес, обратный вызов) {...}

Если цвет и обратный вызов являются обязательными, а размер и вес необязательны. Поэтому, если кто-то хочет вызвать эту функцию только с цветом и обратным вызовом...

save ('blue', function (...) {...}) {...}

 save('blue', 56, function(...) { ... }) { ... }

Но это присваивает функции обратного вызова размер и вес, как я могу исправить это, чтобы делать то, что хочу?

Ответ 1

Параметры JavaScript должны быть согласованы с ожидаемыми параметрами позиционно, поэтому отказ от аргумента между переданными другими не будет работать. Один из вариантов - передать необязательные аргументы в одном объекте.

// callback is required
// additional arguments are passed as props of 'options'
function save(options, callback) { 
    var color = options.color || 'blue';
    var size = options.size || 72;
}

Передайте их следующим образом:

save({ color: 'red' }, function() {});

Ответ 2

Объект параметра решает вашу проблему красиво, например:

function save(params, callback) {
    params.color = params.color || 'default';
    params.size = params.size || 0;
    params.weight = params.weight || 0;

    // ...

    if (callback instanceof Function) { callback(); }
}

Используйте это:

save({ color: 'blue', weight: 100 }, function () { /* ... */ });

Ответ 3

Вы можете проверить arguments.length, чтобы узнать, сколько аргументов было передано, и проверить, есть ли typeof weight === 'function', является ли аргумент обратным вызовом или нет.

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

Ответ 5

Чтобы начать с того, что вы устанавливаете значение обратного вызова по умолчанию самому себе или ближайшему ближайшему параметру до конца (первого) необязательных параметров,

Далее вы проверяете, установлены ли дополнительные параметры как функции (обратный вызов) или undefined, и установите их там по умолчанию или установите их сами.

function optional_params(color, size, weight, callback){
    // set callback to itself or the next optional paramater until you have checked all optional paramaters
  callback = callback || weight || size;
    // check if weight is a function(the callback) or undefined and if so set to a default value, otherwise set weight as weight
  weight = typeof weight != 'function' && typeof weight != 'undefined' ? weight : "1.2kg";
    // do the same as above with weight
  size = typeof size != 'function' && typeof size != 'undefined' ? size : "L";
    // invoke callback
  callback(color,size,weight);
}

И использование:

optional_params("Red",function(color,size,weight){
  console.log("color: " + color); // color: Red
  console.log("size: " + size); // size: L //(default)
  console.log("weight: " + weight); // weight: 1.2kg //(default)
});

Ответ 6

В ответ на ответ SLaks не всегда возможно, что вызывающий может предположить, что они могут отправлять любые аргументы, которые хотят, документирование функции, которая является опцией args, является наилучшим способом для функции вызова вызова функции, типа проверки arg и группировка необязательных аргументов в конец списка arg - это другие. Создание двух опций одного и того же типа требует путаницы.

Ответ 7

Я рекомендую ArgueJS для этого!

function save() {
  arguments = __({color: undefined, size: [undefined], weight: [undefined], callback: Function})

  // access your args by arguments.paramName. Ex.:
  // alert(arguments.color)
...
}

Вы также можете проверить тип своих аргументов, изменив undefined на нужные типы.