Una funzione è un contenitore di istruzioni di codice che possono essere richiamate utilizzando le parentesi ()
operatore. I parametri possono essere passati all'interno delle parentesi durante l'invocazione in modo che le istruzioni nella funzione possano accedere a determinati valori quando la funzione viene richiamata.
Nel seguente codice, creiamo due versioni di an addNumbers
funzione objectone usando il nuovo
operatore e un altro utilizzando il modello letterale più comune. Entrambi si aspettano due parametri. In ogni caso, invochiamo la funzione, passando i parametri tra parentesi ()
operatore.
Esempio: sample76.html
Una funzione può essere utilizzata per restituire un valore, costruire un oggetto o come meccanismo per eseguire semplicemente il codice. JavaScript ha diversi usi per le funzioni, ma nella sua forma più elementare una funzione è semplicemente un ambito univoco di istruzioni eseguibili.
Funzione()
parametriIl Funzione()
costruttore prende un numero indefinito di parametri, ma l'ultimo parametro atteso dal Funzione()
costruttore è una stringa contenente istruzioni che comprendono il corpo della funzione. Qualsiasi parametro passato al costruttore prima dell'ultimo sarà disponibile per la funzione che si sta creando. È anche possibile inviare più parametri come stringa separata da virgole.
Nel codice seguente, io contrasto l'uso del Funzione()
costruttore con i modelli più comuni di istanziazione di un oggetto funzione.
Esempio: sample77.html
Facendo leva direttamente sul Funzione()
il costruttore non è raccomandato o, in genere, è mai stato eseguito perché JavaScript lo utilizzerà eval ()
analizzare la stringa contenente la logica delle funzioni. Molti considerano eval ()
essere inutile in testa. Se è in uso, un difetto nel design del codice è altamente possibile.
Usando il Funzione()
costruttore senza il nuovo
parola chiave ha lo stesso effetto di usare solo il costruttore per creare oggetti funzione (nuova funzione ('x', 'return x')
vs. function (('x', 'return x')
).
Nessuna chiusura viene creata quando si richiama il Funzione()
costruttore direttamente.
Funzione()
Proprietà e metodiL'oggetto funzione ha le seguenti proprietà (escluse proprietà e metodi ereditati):
Proprietà (Function.prototype;
):
prototipo
Le istanze dell'oggetto funzione hanno le proprietà e i metodi seguenti (esclusi proprietà e metodi ereditati):
Proprietà istanza (var myFunction = function (x, y, z) ;
myFunction.length;
):
argomenti
costruttore
lunghezza
Metodi di istanza (var myFunction = function (x, y, z) ;
myFunction.toString ();
):
applicare()
chiamata()
accordare()
Sebbene sia possibile creare una funzione semplicemente per eseguire istruzioni di codice, è anche molto comune che una funzione restituisca un valore. Nel seguente esempio, stiamo restituendo una stringa dal dì ciao
funzione.
Esempio: sample78.html
Se una funzione non specifica un valore di ritorno, non definito
viene restituito. Nel seguente esempio, chiamiamo il guaire
funzione che registra la stringa "guasta" nella console senza restituire esplicitamente un valore.
Esempio: sample79.html
Il concetto da portare via è che tutte le funzioni restituiscono un valore, anche se non si fornisce esplicitamente un valore da restituire. Se non si specifica un valore da restituire, il valore restituito è non definito
.
In JavaScript, le funzioni sono oggetti. Ciò significa che una funzione può essere memorizzata in una variabile, in una matrice o in un oggetto. Inoltre, una funzione può essere passata e restituita da una funzione. Una funzione ha proprietà perché è un oggetto. Tutti questi fattori rendono le funzioni di cittadini di prima classe in JavaScript.
Esempio: sample80.html
È fondamentale rendersi conto che una funzione è un oggetto e quindi un valore. Può essere passato intorno o aumentato come qualsiasi altra espressione in JavaScript.
I parametri sono veicoli per il passaggio di valori nell'ambito di una funzione quando viene invocato. Nel seguente esempio invochiamo addFunction ()
. Dal momento che l'abbiamo predefinito per prendere due parametri, due valori aggiunti diventano disponibili all'interno del suo ambito.
Esempio: sample81.html
In contrasto con altri linguaggi di programmazione, è perfettamente legale in JavaScript omettere i parametri anche se la funzione è stata definita per accettare questi argomenti. I parametri mancanti vengono semplicemente indicati con il valore non definito
. Ovviamente, tralasciando i valori per i parametri, la funzione potrebbe non funzionare correttamente.
Se si passano parametri inaspettati di una funzione (quelli non definiti quando la funzione è stata creata), non si verificherà alcun errore. Ed è possibile accedere a questi parametri dal argomenti
oggetto, che è disponibile per tutte le funzioni.
Questo
e argomenti
I valori sono disponibili per tutte le funzioniAll'interno dello scopo e del corpo di tutte le funzioni, il Questo
e argomenti
i valori sono disponibili.
Il argomenti
object è un oggetto di tipo array che contiene tutti i parametri passati alla funzione. Nel seguente codice, anche se rinunciamo a specificare i parametri quando definiamo la funzione, possiamo fare affidamento sul argomenti
array passato alla funzione per accedere ai parametri se vengono inviati al momento dell'invocazione.
Esempio: sample82.html
Il Questo
parola chiave, passato a tutte le funzioni, è un riferimento all'oggetto che contiene la funzione. Come ci si potrebbe aspettare, le funzioni contenute negli oggetti come proprietà (metodi) possono essere utilizzate Questo
per ottenere un riferimento all'oggetto padre. Quando una funzione è definita nell'ambito globale, il valore di Questo
è l'oggetto globale. Rivedi il seguente codice e assicurati di aver capito cosa Questo
sta tornando.
Esempio: sample83.html
arguments.callee
ProprietàIl argomenti
l'oggetto ha una proprietà chiamata callee
, che è un riferimento alla funzione attualmente in esecuzione. Questa proprietà può essere utilizzata per fare riferimento alla funzione dall'ambito della funzione (arguments.callee
) un auto-riferimento. Nel seguente codice, usiamo questa proprietà per ottenere un riferimento alla funzione chiamante.
Esempio: sample84.html
Questo può essere utile quando una funzione deve essere chiamata in modo ricorsivo.
lunghezza
Proprietà e arguments.length
Il argomenti
l'oggetto ha un unico lunghezza
proprietà. Sebbene si possa pensare che questa proprietà di lunghezza fornisca il numero di argomenti definiti, in realtà fornisce il numero di parametri inviati alla funzione durante l'invocazione.
Esempio: sample85.html
Usando il lunghezza
proprietà di tutti Funzione()
istanze, possiamo effettivamente prendere il numero totale di parametri che la funzione si aspetta.
Esempio: sample86.html
Il arguments.length
la proprietà è stata deprecata in JavaScript 1.4, ma è possibile accedere al numero di argomenti inviati a una funzione da lunghezza
proprietà dell'oggetto funzione. Andando avanti, è possibile ottenere il valore della lunghezza sfruttando il callee
proprietà per ottenere in primo luogo un riferimento alla funzione invocata (arguments.callee.length
).
I parametri di una funzione possono essere ridefiniti all'interno della funzione direttamente o utilizzando il comando argomenti
array. Dai un'occhiata a questo codice:
Esempio: sample87.html
Notare che posso ridefinire il valore del parametro bar usando il argomenti
indicizzare o riassegnando direttamente un nuovo valore al parametro.
Le funzioni possono essere annullate in qualsiasi momento durante l'invocazione utilizzando il ritorno
parola chiave con o senza valore. Nel seguente esempio, stiamo annullando il Inserisci
funzione se i parametri sono indefiniti o non un numero.
Esempio: sample88.html
Il concetto da portare via qui è che è possibile annullare l'esecuzione di una funzione usando il ritorno
parola chiave in qualsiasi momento nell'esecuzione della funzione.
Una funzione può essere definita in tre modi diversi: un costruttore di funzioni, un'istruzione di funzione o un'espressione di funzione. Nell'esempio seguente, mostro ogni variazione.
Esempio: sample89.html
Alcuni hanno detto che esiste un quarto tipo di definizione per le funzioni, chiamato "espressione della funzione denominata". Un'espressione di funzione con nome è semplicemente un'espressione di funzione che contiene anche un nome (ad es., var add = function add (x, y) return x + y
).
chiamata()
e applicare()
)Le funzioni sono invocate usando quattro diversi scenari o modelli.
applicare()
o chiamata()
Nel seguente esempio, esaminiamo ciascuno di questi modelli di invocazione.
Esempio: sample90.html
Assicurati di essere a conoscenza di tutti e quattro i modelli di chiamata, in quanto il codice che incontrerai potrebbe contenere uno di essi.
Una funzione anonima è una funzione a cui non viene assegnato un identificatore. Le funzioni anonime vengono principalmente utilizzate per passare le funzioni come parametro a un'altra funzione.
Esempio: sample91.html
Un'espressione di funzione (davvero qualsiasi funzione tranne una creata dal Funzione()
costruttore) può essere immediatamente richiamato dopo la definizione utilizzando l'operatore parentesi. Nel seguente esempio, creiamo a Dici parola()
espressione della funzione e quindi invoca immediatamente la funzione. Questa è considerata una funzione auto-invocante.
Esempio: sample92.html
È possibile creare una dichiarazione di funzione anonima che è auto-invocata. Questa è chiamata funzione anonima autoinvitante. Nel seguente esempio, creiamo diverse funzioni anonime che vengono invocate immediatamente.
Esempio: sample93.html
Secondo lo standard ECMAScript, le parentesi attorno alla funzione (o qualsiasi cosa che trasforma la funzione in un'espressione) sono necessarie se la funzione deve essere invocata immediatamente.
Le funzioni possono essere annidate all'interno di altre funzioni indefinitamente. Nel seguente esempio di codice, incapsuliamo il goo
funzione all'interno del bar
funzione, che è all'interno del foo
funzione.
Esempio: sample94.html
Il semplice concetto qui è che le funzioni possono essere annidate e non c'è limite alla profondità del nesting.
Ricorda, il valore di Questo
per le funzioni annidate sarà l'oggetto principale (il finestra
oggetto in un browser Web) in JavaScript 1.5, ECMA-262, Edizione 3.
Come accennato in precedenza, le funzioni sono cittadini di prima classe in JavaScript. E poiché una funzione è un valore e una funzione può essere passata a qualsiasi tipo di valore, è possibile passare una funzione a una funzione. Le funzioni che accettano e / o restituiscono altre funzioni sono talvolta chiamate "funzioni di ordine superiore.
Nel seguente codice, stiamo passando una funzione anonima al foo
funzione che torniamo immediatamente dal foo
funzione. È questa funzione anonima che la variabile bar
punta a, dal foo
accetta e restituisce la funzione anonima.
Esempio: sample95.html
Cosi quando bar
viene invocato, richiama la funzione anonima che è stata passata al foo ()
funzione, che viene quindi restituita dal foo ()
funzione e referenziato dal bar
variabile. Tutto questo per mostrare il fatto che le funzioni possono essere passate come qualsiasi altro valore.
Una dichiarazione di funzione può essere invocata durante l'esecuzione prima della sua effettiva definizione. Questo è un po 'strano, ma dovresti esserne consapevole in modo da poterlo sfruttare, o almeno sapere cosa sta succedendo quando lo incontri. Nel seguente esempio, invoco il sayYo ()
e somma()
istruzioni di funzione prima che siano definite.
Esempio: sample96.html
Ciò accade perché prima dell'esecuzione del codice, le istruzioni di funzione vengono interpretate e aggiunte allo stack / contesto di esecuzione. Assicurati di esserne a conoscenza mentre usi le istruzioni di funzione.
Le funzioni definite come espressioni di funzioni non vengono issate. Solo le istruzioni di funzione sono issate.
È perfettamente legittimo per una funzione chiamarsi. In realtà, questo è spesso usato in modelli di codifica ben noti. Nel codice che segue, iniziamo il countDownFrom
funzione, che quindi chiama se stessa tramite il nome della funzione countDownFrom
. In sostanza, questo crea un ciclo che conta alla rovescia da 5 a 0.
Esempio: sample97.html
Dovresti essere consapevole del fatto che è naturale che una funzione invochi se stessa (ovvero la ricorsione) o lo faccia ripetutamente.
Le funzioni sono uno degli aspetti più utilizzati di JavaScript, si spera che ora abbia una migliore comprensione di come usarli.