Funzioni

Funzioni

Tutte fanno approssimativamente la stessa cosa, con alcune sottili differenze:

C’è una distinzione tra il nome della funzione e la variabile a cui la funzione è assegnata. Il nome della funzione non può essere modificato, mentre la variabile a cui è assegnata la funzione può essere riassegnata. Il nome della funzione può essere utilizzato solo all’interno del corpo della funzione. Il tentativo di utilizzarlo al di fuori del corpo della funzione comporta un errore (o undefined se il nome della funzione è stato precedentemente dichiarato tramite un’istruzione var)., Ad esempio:

var y = function x() {};alert(x); // throws an error

Il nome della funzione viene visualizzato anche quando la funzione viene serializzata tramite il metodo toString di Function.

D’altra parte, la variabile a cui viene assegnata la funzione è limitata solo dal suo ambito, che è garantito per includere l’ambito in cui viene dichiarata la funzione.

Come mostra il 4 ° esempio, il nome della funzione può essere diverso dalla variabile a cui è assegnata la funzione. Non hanno alcuna relazione l’uno con l’altro. Una dichiarazione di funzione crea anche una variabile con lo stesso nome del nome della funzione., Pertanto, a differenza di quelli definiti dalle espressioni di funzione, le funzioni definite dalle dichiarazioni di funzione possono essere accessibili con il loro nome nell’ambito in cui sono state definite:

Una funzione definita da ‘new Function' non ha un nome di funzione. Tuttavia, nel motore JavaScript di SpiderMonkey, la forma serializzata della funzione mostra come se avesse il nome “anonimo”. Ad esempio,alert(new Function()) uscite:

function anonymous() {}

Poiché la funzione in realtà non ha un nome,anonymous non è una variabile accessibile all’interno della funzione., Ad esempio, il seguente risultato potrebbe essere un errore:

var foo = new Function("alert(anonymous);");foo();

A differenza delle funzioni definite dalle espressioni di funzione o dal costruttore Function, una funzione definita da una dichiarazione di funzione può essere utilizzata prima della dichiarazione di funzione stessa. Ad esempio:

foo(); // alerts FOO!function foo() { alert('FOO!');}

Una funzione definita da un’espressione di funzione o da una dichiarazione di funzione eredita l’ambito corrente. Cioè, la funzione forma una chiusura., D’altra parte, una funzione definita da un costruttoreFunction non eredita alcun ambito diverso dall’ambito globale (che tutte le funzioni ereditano).

Le funzioni definite dalle espressioni di funzione e dalle dichiarazioni di funzione vengono analizzate una sola volta, mentre quelle definite dal costruttoreFunction non lo sono. Cioè, la stringa del corpo della funzione passata al costruttoreFunction deve essere analizzata ogni volta che viene chiamato il costruttore., Sebbene un’espressione di funzione crei una chiusura ogni volta, il corpo della funzione non viene ripartito, quindi le espressioni di funzione sono ancora più veloci di “new Function(...)“. Pertanto il costruttoreFunction dovrebbe generalmente essere evitato quando possibile.

Va notato, tuttavia, che le espressioni di funzione e le dichiarazioni di funzione nidificate all’interno della funzione generata analizzando una stringa Function constructor non vengono analizzate ripetutamente. Ad esempio:

Una dichiarazione di funzione è molto facilmente (e spesso involontariamente) trasformata in un’espressione di funzione., Una dichiarazione di funzione cessa di essere una quando:

  • diventa parte di un’espressione
  • non è più un “elemento sorgente” di una funzione o dello script stesso. Un “elemento sorgente” è un’istruzione non nidificata nello script o un corpo di funzione:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *