У меня есть статическая функция javascript, которая может принимать 1, 2 или 3 параметра:
function getData(id, parameters, callback) //parameters (associative array) and callback (function) are optional
Я знаю, что всегда могу проверить, является ли данный параметр неопределенным, но как мне узнать, что было передано, было параметром или обратным вызовом?
Как лучше всего это сделать?
Примеры того, что можно было передать:
1:
getData('offers');
2:
var array = new Array();
array['type']='lalal';
getData('offers',array);
3:
var foo = function (){...}
getData('offers',foo);
4:
getData('offers',array,foo);
javascript
юлианский день.
источник
источник
Ответы:
Вы можете узнать, сколько аргументов было передано вашей функции, и вы можете проверить, является ли ваш второй аргумент функцией или нет:
Вы также можете использовать объект arguments таким образом:
Если вам интересно, прочтите эту статью Джона Ресига о технике имитации перегрузки методов в JavaScript.
источник
Эээ - это означало бы, что вы вызываете свою функцию с аргументами, которые не находятся в правильном порядке ... что я бы не рекомендовал.
Я бы рекомендовал вместо этого передать объект вашей функции следующим образом:
Преимущества:
Недостатки:
Если у вас нет выбора, вы можете использовать функцию, чтобы определить, действительно ли объект является функцией (см. Последний пример).
Примечание. Это правильный способ обнаружения функции:
источник
Поэтому используйте оператор typeof, чтобы определить, является ли второй параметр массивом или функцией.
Это может дать несколько предложений: http://www.planetpdf.com/developer/article.asp?ContentID=testing_for_object_types_in_ja
Я не уверен, работа это или домашнее задание, поэтому я не хочу сейчас давать вам ответ, но тип поможет вам определить его.
источник
Вам следует проверить тип полученных параметров. Возможно, вам стоит использовать
arguments
массив, поскольку второй параметр может иногда быть «параметрами», а иногда «обратным вызовом», и наименование его параметров может вводить в заблуждение.источник
Я знаю, что это довольно старый вопрос, но я занимался этим недавно. Сообщите мне, что вы думаете об этом решении.
Я создал служебную программу, которая позволяет мне строго вводить аргументы и делать их необязательными. Вы в основном заключаете свою функцию в прокси. Если вы пропустите аргумент, он не определен . Это может показаться странным, если у вас есть несколько необязательных аргументов одного и того же типа рядом друг с другом. (Существуют варианты передачи функций вместо типов для проверки настраиваемых аргументов, а также указание значений по умолчанию для каждого параметра.)
Вот как выглядит реализация:
Для наглядности вот что происходит:
Вы можете просмотреть код прокси-сервераrangeArgs в моем репозитории GitHub здесь:
https://github.com/joelvh/Sysmo.js/blob/master/sysmo.js
Вот служебная функция с некоторыми комментариями, скопированными из репозитория:
источник
Я рекомендую вам использовать ArgueJS .
Вы можете просто ввести свою функцию следующим образом:
На ваших примерах я считал, что вы хотите, чтобы ваш
id
параметр был строкой, верно? ТеперьgetData
требуется aString id
и принимает вариантыObject parameters
иFunction callback
. Все опубликованные вами варианты использования будут работать должным образом.источник
Вы можете использовать свойство объекта arguments внутри функции.
источник
Вы хотите сказать, что у вас могут быть такие вызовы: getData (id, parameters); getData (идентификатор, обратный вызов)?
В этом случае вы, очевидно, не можете полагаться на позицию, и вам нужно полагаться на анализ типа: getType (), а затем, при необходимости, getTypeName ()
Проверьте, является ли рассматриваемый параметр массивом или функцией.
источник
Я думаю, вы хотите использовать здесь typeof ():
источник
Если ваша проблема связана только с перегрузкой функции (вам нужно проверить, является ли параметр «параметры» «параметрами», а не «обратным вызовом»), я бы рекомендовал вам не беспокоиться о типе аргумента и
использовать этот подход . Идея проста - используйте буквальные объекты для объединения ваших параметров:
источник
Я думаю, это может быть очевидным примером:
источник
Можете ли вы переопределить функцию? Это не сработает:
источник