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

В JavaScript, как я могу создать функцию с необязательным параметром?

Вопрос: Каким образом можно определить функцию в JavaScript, которая принимает необязательные параметры?

Например:

function myFunc(optionVar1) {
    if(optionVar1 == undefined) {
        ...
    } else {
        ...
    }
}

myFunc('10');  // valid function call
myFunc();      // also a valid function call

Правильно ли использовать знак ?, как Ruby, в объявлении функции, чтобы обозначить необязательные параметры:

function myFunc(optionVar1?) {...}  //  <--- notice the ? mark
4b9b3361

Ответ 1

Первый ответ Google, который я обнаружил:

http://www.tipstrs.com/tip/354/Using-optional-parameters-in-Javascript-functions

Я не видел случаев, когда знак вопроса используется для предупреждения вызывающего абонента о необязательном параметре. Хотя это делается на других языках, я не считаю это необходимым в javascript.

На самом деле, кажется, что вы не можете использовать вопросительный знак в имени переменной. Только буквы, цифры, $ и _.

Ответ 2

В Javascript нет синтаксиса, который указывает, что параметр является необязательным (или обязательным). Все параметры являются необязательными. Если они не указаны, они undefined, поэтому вам нужно это проверить. Например, эта функция фактически создаст значение по умолчанию 10 для параметра:

function myfunc(someParam) {
  if (someParam === undefined) {
    someParam = 10;
  }
  ...
}

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

Наконец, если у вас более 3-4 параметров, обычно рекомендуется использовать анонимный объект.

Ответ 3

Собственно, все параметры являются необязательными в JS-функциях. Если вы не указали параметр, нет предупреждения или ошибки.

Вы можете установить значения по умолчанию, например

function throw_cat(dist){
  dist = typeof dist=='undefined' ? 20 : dist;
   //OR
  dist = dist || 20; //this will assign it to 20 if you pass 0 or another 'falsy' value, though. May be good if you expect a string. String '0' stays, '' or null assigns the default
  //etc...
  }

Ответ 4

Вы можете использовать аннотацию, например {Object =} или {number =} в разделе комментариев при использовании doclet:

/** 
 * @param {object=}xyz
 */ 

Современная среда IDE знает, как распознать аннотации для JavaScript и показывает вам показания о потенциальных проблемах в вашем коде.

Пример:

/**
 *
 * @param query 
 * @param callback 
 * @param {number=} ttl optional time-to-leave
 */
 loadByJSONP:function loadByJSONP(query, callback, ttl) {
   ...do some work
 }

В этом примере 'ttl' не является обязательным. аннотация {number =} указывает IDE, что этот параметр является необязательным. Соответственно, когда вы вызываете эту функцию только с двумя параметрами, вы не получите предупреждения.

Аннотации могут также использоваться для обозначения ожидаемого типа. это делает ваш код лучше и менее подвержен ошибкам. Вот ссылка на аннотации:

https://developers.google.com/closure/compiler/docs/js-for-compiler

Ответ 5

Во-первых, каждый, кто пишет JavaScript, делает себе одолжение и проходит через "Обучение продвинутому JavaScript" из John Resig.

function myFunc(arg1, arg2 /* varargs... */) {
  var optional = Array.prototype.slice.call( arguments, 2 );

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

Просто рассмотрите документирование их.

Ответ 6

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

Подробнее об этом можно прочитать здесь: http://www.devguru.org/technologies/ecmascript/quickref/arguments.html

Ответ 7

cletus и Damovisa сделали хорошие предложения. Я также хотел бы добавить, что некоторые (например, я) могут предпочесть такие обозначения:

function foo(/*bar*/) {
   if (arguments.length == 1) {
      var bar = arguments[0];
      ...
   }
}

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

Изменить: Это особенно полезно для необязательных аргументов, которые предназначены для внутреннего использования.

Ответ 8

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

<HTML>
<HEAD>
<SCRIPT Language="JavaScript">
function foo() {
  var argv = foo.arguments;
  var argc = argv.length;
  for (var i = 0; i < argc; i++) {
    alert("Argument " + i + " = " + argv[i]);
   }
}
</SCRIPT>
</HEAD>
<BODY onload="foo('hello', 'world');">
</BODY>
</HTML>

Ответ 9

Правильно ли использовать? отметьте как Ruby в объявлении функции

Нет, нет языкового метода, обозначающего необязательный аргумент arg. Я определенно считаю, что это стоит указать в комментарии:

function myFunc(var1, var2 /* optional */, var3 /* optional */) {
    if (var2===undefined) ...

(Обратите внимание на тройные равенства для точного тестирования равенства. В противном случае также будет передано значение null. Обычно вы хотите === для большинства сравнений в JS, так как double-equals нежелательно слабо типизированы.)

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

function myFunc(var1 /* , optional var2..varN */) {
    for (var i= 1; i<arguments.length; i++) ...

Ответ 10

Для истории: Вы можете зациклить свои аргументы с проверкой != null. Например:

function container(param1, param2, param3, param4){
    var param1, param2, param3, param4 = 0 // or other data types.
    for (var i = 0; i < arguments.length; i++){
       if(i != null) {
       console.log(i); // or put default values to your parameters if you need to.
    }
}

Теперь все аргументы становятся необязательными.