2010-02-09 11 views
22

Domanda: Qual è il modo corretto di definire una funzione in JavaScript che utilizza parametri facoltativi?In JavaScript, come posso creare una funzione con un parametro opzionale?

Ad esempio:

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

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

è corretto utilizzare un marchio ? come Ruby nella dichiarazione di funzione in questo modo per indicare parametri opzionali:

function myFunc(optionVar1?) {...} // <--- notice the ? mark 
+0

Ho aggiornato la mia risposta qui sotto, ma la risposta è no, il punto interrogativo non è un carattere ammesso per un nome di variabile. – Damovisa

risposta

2

La prima risposta di Google ho scoperto:

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

Non ho visto alcun caso in cui viene utilizzato un punto interrogativo per avvisare un chiamante su un parametro facoltativo. Mentre è fatto in altre lingue, non penso sia necessario in javascript.

Infatti, it seems that you can't use a question mark in the variable name. Solo lettere, numeri, $ e _.

+0

Purtroppo l'articolo non è di aiuto. – SeanD

+0

Siamo spiacenti, ho aggiornato la mia risposta. – Damovisa

+0

Che peccato. Quale la dichiarazione di argomento ha permesso di denotare quali parametri sono e non sono richiesti. – SeanD

53

Non c'è sintassi in Javascript che specifica che un parametro è facoltativo (o obbligatorio). Tutti i parametri sono opzionali Se non vengono specificati, sono undefined quindi è necessario verificarlo. Ad esempio, questa funzione a tutti gli effetti creare un valore predefinito di 10 per il parametro:

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

Inoltre è possibile accedere ai parametri di programmazione utilizzando la proprietà arguments.

Infine, se si dispone di più di circa 3-4 parametri, in genere è consigliabile utilizzare invece un oggetto anonimo.

+1

Questo può essere semplificato in ES6 'function myfunc (someParam = 10) {Tutto il codice ...}' – Tim

0

Basta non definire la funzione con alcun parametro e accedere alla matrice di argomenti speciali all'interno della funzione in cui si desidera che i parametri opzionali siano. Esempio di seguito.

<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> 
+0

Questo doesn ' t aiutare le persone a sapere quali parametri dovrebbero essere inclusi. Sembra kludgy – SeanD

+0

niente che un bel commento di funzione non possa gestire: p – James

7

In realtà, tutti i parametri sono opzionali nelle funzioni JS. Non vi è alcun avviso o errore se si omette un parametro.

È possibile impostare i valori predefiniti come

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... 
    } 
+1

'typeof' restituisce una stringa. Usa 'typeof dist === 'undefined'', o, la mia preferenza, solo' dist === undefined'. – bobince

+0

Grazie, sono un po 'incerto su questo. In alcuni contesti (ad esempio all'esterno di una funzione), facendo 'if (randomvar == undefined)' produce un errore - 'ReferenceError: randomvar non è definito' quindi vado con typeof. Aggiungerò le virgolette. – JAL

1

Alcune fonti vi dirà di saltare i parametri del tutto e invece fare uso della matrice argomenti. Ciò ti consente di prendere qualsiasi input fornito alla tua funzione, e puoi decidere come rispondere agli argomenti passati alla tua funzione come meglio credi.

Si può leggere di più su di esso qui: http://www.devguru.org/technologies/ecmascript/quickref/arguments.html

+1

collegamento è rotto ... –

1

Cletus e Damovisa avete fatto buoni suggerimenti.Vorrei anche aggiungere che alcuni (come me) potrebbe preferire una notazione come questo:

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

Questo serve a documentare agli sviluppatori del vostro codice di base che l'argomento è facoltativo e anche documenta il nome, ma impedisce anche il argomento da rivelare il nome della funzione in un debugger (nell'esempio rivelerebbe come foo() anziché foo (optional_argument). in caso contrario, gli sviluppatori che stanno consumando l'API potrebbe supporre che è stato richiesto.

Modifica: questo è particolarmente utile per gli argomenti opzionali che sono destinati a essere utilizzati internamente.

0

Is it proper to use a ? mark like Ruby in the function declaration

No, non c'è un modo basato sul linguaggio denotano un ARG opzionale. Sono assolutamente convinta che valga la pena che indica in un commento, però:

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

(Si noti il ​​triplo è uguale per il test esatto uguaglianza In caso contrario, un null valore passato sarà anche corrispondere in genere si desidera === per la maggior parte confronti in JS, come.. delle doppie uguale è indesiderato debolmente tipizzato)

Per quando hai un numero indeterminato di argomenti opzionali, in genere li omettere dalla dichiarazione di funzione, e di nuovo un commento è educato:.

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

Per prima cosa, chiunque scriva JavaScript, fare un favore a te stesso e passare attraverso Learning Advanced JavaScript da John Resig.

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

Ogni parametro di una funzione è "opzionale", anche quelli dichiarati nella lista parametri della dichiarazione di funzione.

Considerate semplicemente documenting bene.

2

È possibile utilizzare l'annotazione come {Object =} o {numero =} nella sezione commenti quando si utilizza un doclet:

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

moderno IDE sa riconoscere le annotazioni per Javascript e mostra le indicazioni su potenziali problemi nel tuo codice.

Esempio:

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

In questo esempio 'TTL' è facoltativo. l'annotazione {number =} indica a IDE che questo parametro è facoltativo. Di conseguenza, quando chiami questa funzione solo con due parametri, non riceverai alcun avviso.

Le annotazioni possono anche essere utilizzate per designare il tipo previsto. questo rende il tuo codice migliore e meno incline ai bug. Ecco il link per le annotazioni:

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

Problemi correlati