2012-06-19 13 views
53

Sono nuovo al mondo di Javascript e sto armeggiando con la scrittura di funzioni molto basilari e sono incappato per caso nell'esempio sottostante e sono incerto sul perché funzioni quando non sto passando un parametro quando la funzione lo richiede.Cosa succede se non passo un parametro in una funzione Javascript?

funzione di esempio

function myfunction(x) { 
    alert("This is a sample alert"); 
} 

Ora, se mi chiama la funzione myfunction(); mi sono presentato con l'avviso. Perché è possibile chiamare la funzione senza errori o avvisi quando non ho superato un parametro?

EDIT

non mi aspettavo così tanti grandi risposte e io sono in alcun modo in una posizione ancora in grado di dire quale risposta è la migliore modo io sono in grado di richiedere alle persone di suggerire la migliore risposta e Assegnerò l'accettazione a quella persona.

+2

Potrebbe anche essere utile: https://developer.mozilla.org/en/JavaScript/Guide/Functions –

+1

Non c'è sovraccarico basato su firme di funzione in JS quindi non importa quanti parametri la funzione "si aspetta" ". Puoi anche passare in parametri che la funzione non è definita da prendere e utilizzare semplicemente gli argomenti della parola chiave per recuperarli. – scrappedcola

+0

@scrappedcola - Cosa intendi per sovraccarico e passaggio di parametri che la funzione non è definita da prendere? Puoi dare degli esempi? – PeanutsMonkey

risposta

57

Niente sarà felice, il che significa che non si riceverà un errore o un avvertimento poiché passare i parametri in javascript è facoltativo.
Tutti i parametri che non sono stati "forniti" avranno lo undefined value.

function foo(x, y, z){ 
    //... 
} 

foo(1); 

All'interno della funzione foo ora:

function foo(x, y, z){ 
    x === 1 
    y === undefined 
    z === undefined 
} 

si può anche passare più argomenti, come:

foo(1,2,3,4,5,7); // Valid! 

è possibile conoscere la quantità di parametri forniti dal arguments.length dall'interno della funzione di .

Live DEMO


Il codice dalla demo:

function foo(x, y, z) { 
    console.log('x value: ' + x); 
    console.log('y value: ' + y); 
    console.log('z value: ' + z); 
    console.log('Arguments length: ' + arguments.length); 
} 

console.log('Zero parameters'); 
foo(); 
console.log('Four parameters'); 
foo(1, 2, 3, 4);​ 

Esempio di funzione utile che gestire qualsiasi quantità di parametri:

function max() { 
    var maxValue = arguments[0]; 
    for (var i = 1; i < arguments.length; i++) { 
     if (maxValue < arguments[i]) { 
      maxValue = arguments[i]; 
     } 
    } 
    return maxValue; 
} 

Live DEMO

+0

Grazie per la demo dal vivo. Non mi aspettavo così tante buone risposte. Quindi se ho una funzione come 'function myfunction (a, b) {}' e ho passato la mia funzione valori (1,2,3,4,5), suppongo che sia ancora valida? L'aspettativa che ci sarà qualche avvertimento o errore? – PeanutsMonkey

+0

Scusa, ti dispiacerebbe elaborare il comando 'console.log' come pure argomento.lunghezza? – PeanutsMonkey

+0

@PeanutsMonkey. Valido! nessun avviso nessun errore, sarà persino utile, ti darò una demo in un attimo. – gdoron

5

Ecco come funziona JavaScript. I parametri sono opzionali e avranno il valore non-veramente-un-valore "indefinito" nella funzione se mancano da una chiamata di funzione.

Per "facoltativo" intendo proprio questo: invocare la funzione qualsiasi implica un elenco arbitrario di parametri. Non è necessario alcun rapporto tra il numero di parametri passato a per una funzione e il numero dichiarato. Il modo migliore per pensare a questa dichiarazione, quindi:

function x(a, b, c) { 
    // ... 
} 

è che si sta dichiarando una funzione e vincolante il nome "a" al primo parametro, "b" alla seconda, e "c" al terzo. Non è in alcun modo garantito, tuttavia, che uno di questi sia in realtà essere associato a un valore in una determinata chiamata successiva della funzione.

Per lo stesso motivo, è possibile definire una funzione senza parametri a tutti, e poi "trovare" loro tramite l'oggetto arguments:

function noArgs() { 
    var a = arguments[0], b = arguments[1], c = arguments[2]; 
    // ... 
} 

modo che non è abbastanza la stessa della prima funzione , ma è vicino nella maggior parte dei modi che contano praticamente.

Il valore "non definito" in JavaScript è un valore, ma la semantica è piuttosto insolita come le lingue. In particolare, non è esattamente uguale al valore null. Inoltre, "non definito" non è una parola chiave; è solo un nome variabile semi-speciale!

+0

Potresti approfondire cosa intendi per 'opzionale' così come per" non proprio un valore "valore' indefinito'? – PeanutsMonkey

+0

@PeanutsMonkey: se la variabile non viene fornita, sarà 'indefinita'. –

+0

@Pointy: cosa intendi per non garantire che uno qualsiasi dei parametri dichiarati sarà effettivamente associato a un valore? – PeanutsMonkey

7

Tutti gli argomenti nelle funzioni JavaScript sono facoltativi (leggi "genericamente digitato").

funzioni JavaScript può essere richiamato con un numero qualsiasi di argomenti, indipendentemente dal numero di argomenti con nome nella funzione definizione. Poiché una funzione viene digitata in modo approssimato, non è possibile per dichiarare il tipo di argomenti che si aspetta ed è legale per il passaggio di valori di qualsiasi tipo a qualsiasi funzione, . Quando una funzione è invocata con meno argomenti di quelli dichiarati, gli argomenti aggiuntivi hanno il valore non definito.

È possibile fare riferimento agli argomenti di una funzione all'interno della funzione utilizzando le variabili argomento nominate o l'oggetto argomenti. Questo oggetto contiene una voce per ogni argomento passato alla funzione, l'indice della prima voce che inizia a 0. Ad esempio, se una funzione viene passato tre argomenti, si può fare riferimento alla tesi come segue:

arguments[0] 
arguments[1] 
arguments[2] 
  • JavaScript - The Definitive Guide, 5th Edition
1

Perché non c'è errore fino a quando la funzione si aspetta di essere in grado di lavorare con il parametro che si suppone di passare.

Ad esempio:

function myfunction(x) { 
    return x*2; 
} 

getterebbe un errore; anche se probabilmente solo uno NaN (in questo caso) o uno variable is undefined.

+0

Va bene fino a quando non faccio riferimento al parametro nella funzione, non otterrò un errore? È giusto? – PeanutsMonkey

+0

Ecco come sembra funzionare, sì. –

+0

Ora, se elaboro l'esempio, fornisci i.e. function functionfunction (a, b) {var calc = a + b; return;} 'e quindi richiama la funzione' document.write (myfunction (1.2)); 'perché ho ancora il valore di' undefined' anche se sto passando un parametro? – PeanutsMonkey

2

JavaScript non ha valori predefiniti per i parametri di funzione come fanno gli altri linguaggi. Quindi, puoi passare tante o poche discussioni quante vuoi.

Se non si passa un valore, il parametro è undefined.

function myfunction(x) { 
    alert(x); 
} 

myfunction(); // alerts undefined 
myfunction(1); // alerts 1 
myfunction(1,2,3); // alerts 1 

Se si passa più parametri superiore rispetto a quelle nella firma, è possibile utilizzare arguments.

function myfunction(x) { 
    alert(x); 
    console.log(arguments); 
} 

myfunction(1,2,3); // alerts 1, logs [1,2,3] 
+0

Grazie. Piuttosto che postare la croce, puoi vedere il mio esempio che ho fornito a David Thomas perché ottengo ancora l'errore 'undefined' – PeanutsMonkey

+0

@PeanutsMonkey: Huh? Qual è il tuo problema? –

+0

Non è un problema di per sé. Mi riferivo alla mia domanda di follow-up a David sul passaggio di più parametri che hai incluso nella tua risposta. Quello che non seguo è ciò che intendi per 'logs'? Dove lo registra? – PeanutsMonkey

1

È possibile anche fornire più parametri oltre quello citato nella funzione

myFunction(1,2,3,4,5,6,7,'etc'); 

È possibile utilizzare la proprietà arguments che è una matrice per visualizzare gli argomenti forniti.

+1

+1 per menzionare 'argomenti'. –

+0

Gli argomenti @albert non sono array come oggetti [vedi] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments) – Mahi

0

Se si omette l'argomento, il suo valore sarà undefined. Ciò consente di creare parametri opzionali abbastanza facilmente.

Un'altra caratteristica è la possibilità di definire una funzione senza parametri e chiamarla con argomenti con successo, utilizzando l'oggetto arguments. Ciò consente di creare facilmente array di argomenti a lunghezza variabile.

Problemi correlati