Skip to content

Commit 022395e

Browse files
authored
Merge pull request #202 from Dorin-David/Articolo/16-function-expressions
articolo function expressions
2 parents 67a15a5 + 9b70ed0 commit 022395e

File tree

1 file changed

+60
-55
lines changed
  • 1-js/02-first-steps/16-function-expressions

1 file changed

+60
-55
lines changed

1-js/02-first-steps/16-function-expressions/article.md

Lines changed: 60 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
# Espressioni di funzione
1+
# Function expression
22

33
In JavaScript, una funzione non è una "struttura magica del linguaggio", ma un valore speciale.
44

5-
La sintassi che abbiamo utilizzato prima vien chiamata *Dichiarazione di Funzione*:
5+
La sintassi che abbiamo utilizzato finora viene chiamata *Dichiarazione di Funzione*:
66

77
```js
88
function sayHi() {
99
alert( "Hello" );
1010
}
1111
```
1212

13-
E' disponibile un'altra sintassi per creare una funzione chiamata *Espressione di Funzione*.
13+
E' disponibile un'altra sintassi per creare una funzione, chiamata *function expression*.
1414

15-
Ed appare cosi:
15+
La sintassi:
1616

1717
```js
1818
let sayHi = function() {
1919
alert( "Hello" );
2020
};
2121
```
2222

23-
Qui la funzione viene creata ed assegnata ad una variabile esplicitamente proprio come qualsiasi altro valore. Non ha importanza come la funzione viene definita, è solo una valor salvato nella variabile `sayHi`.
23+
Qui la funzione viene esplicitamente creata ed assegnata ad una variabile, proprio come un qualsiasi altro valore. Non ha importanza come la funzione viene definita, è solo un valore salvato nella variabile `sayHi`.
2424

25-
Il significato di questo esempio è lo stesso di: "creare una funzione e metterla dentro la variabile `sayHi`".
25+
Il significato di questo esempio è lo stesso di: "crea una funzione e mettila dentro la variabile `sayHi`".
2626

27-
Possiamo anche stamparne il valore usando `alert`:
27+
Possiamo anche mostrarne il valore usando `alert`:
2828

2929
```js run
3030
function sayHi() {
@@ -36,13 +36,13 @@ alert( sayHi ); // mostra il codice della funzione
3636
*/!*
3737
```
3838

39-
Da notare che l'ultima riga di codice non esegue la funzione, perchè non ci sono parentesi dopo `sayHi`. Ci sono linguaggi di programmazione in cui la semplice menzione del nome di funzione ne causa l'esecuzione, JavaScript non si comporta cosi.
39+
Da notare che l'ultima riga di codice non esegue la funzione, perché non ci sono parentesi dopo `sayHi`. Ci sono linguaggi di programmazione in cui la semplice menzione del nome di una funzione ne causa l'esecuzione; JavaScript non funziona così.
4040

41-
In JavaScript, una funzione è un valore, quindi possiamo trattarla come un valore. Il codice sopra ne mostra la sua rappresentazione in stringa, cioè il codice contenuto dentro la funzione.
41+
In JavaScript, una funzione è un valore, quindi possiamo lavorarci come con un qualsiasi altro valore. Il codice sopra ne mostra la sua rappresentazione in stringa, cioè il codice contenuto dentro la funzione.
4242

43-
E' chiaramente un valore speciale, poichè possiamo richiamarla con `sayHi()`.
43+
E' chiaramente un valore speciale, poiché possiamo richiamarla con `sayHi()`.
4444

45-
Ma rimane comunque un valore. Quindi possiamo trattarlo come un qualsiasi altro valore.
45+
Ma rimane comunque un valore, e come tale possiamo trattarlo.
4646

4747
Possiamo copiare la funzione in un'altra variabile:
4848

@@ -54,18 +54,18 @@ function sayHi() { // (1) creazione
5454
let func = sayHi; // (2) copia
5555

5656
func(); // Hello // (3) esegue la copia (funziona)!
57-
sayHi(); // Hello // anche questa continua a funzionare (ed è giusto che sia cosi)
57+
sayHi(); // Hello // anche questa continua a funzionare (perché non dovrebbe?)
5858
```
5959

60-
Quello che succede nel dettaglio è:
60+
Quello che succede, nel dettaglio, è:
6161

6262
1. La dichiarazione di funzione `(1)` crea la funzione e la inserisce nella variabile denominata `sayHi`.
6363
2. La linea `(2)` la copia nella variabile `func`.
6464

65-
Ancora una volta: non ci sono parentesi dopo `sayHi`. Se ci fossero state, allora `func = sayHi()` avrebbe scritto *il risultato della chiamata* `sayHi()` in `func`, non *la funzione* `sayHi`.
65+
Ancora una volta: non ci sono parentesi dopo `sayHi`. Se ci fossero state, allora `func = sayHi()` avrebbe inserito *il risultato della chiamata* `sayHi()`, non *la funzione* `sayHi`.
6666
3. Adesso la funzione può essere richiamata sia con `sayHi()` che con `func()`.
6767

68-
Avremmo anche potuto utilizzare un espressione di funzione per dichiarare `sayHi`, nella prima riga:
68+
Avremmo anche potuto utilizzare, nella prima riga, una function expression per dichiarare `sayHi`:
6969

7070
```js
7171
let sayHi = function() {
@@ -79,8 +79,8 @@ let func = sayHi;
7979
Tutto funzionerebbe ugualmente. Risulta anche più chiaro cosa sta succedendo, giusto?
8080

8181

82-
````smart header="Perchè c'è un punto e virgola alla fine?"
83-
Vi starete chiedendo perchè con l'espressione di funzione bisogna mettere `;` alla fine, mentre con la dichiarazione di funzione non serve:
82+
````smart header="Perché c'è un punto e virgola alla fine?"
83+
Vi starete chiedendo perché con la function expression bisogna mettere `;` alla fine, mentre con la dichiarazione di funzione non serve:
8484
8585
```js
8686
function sayHi() {
@@ -94,12 +94,12 @@ let sayHi = function() {
9494
9595
La risposta è semplice:
9696
- Non c'è bisogno di `;` alla fine dei blocchi di codice che utilizzano una sintassi del tipo `if { ... }`, `for { }`, `function f { }` etc.
97-
- Un espressione di funzione viene utilizzata all'interno di un istruzione: `let sayHi = ...;`, come valore. Non è un blocco di codice. Quindi il `;` è consigliato al termine dell'istruzione, indipendentemente dal valore. Quindi il punto e virgola non è collegato all'espressione di funzione, più semplicemente termina un istruzione.
97+
- Una function expression viene utilizzata all'interno di un'istruzione: `let sayHi = ...;`, come valore. Non è un blocco di codice. Quindi il `;` è consigliato al termine dell'istruzione, indipendentemente dal valore. Il punto e virgola non è collegato alla function expression; più semplicemente, termina un'istruzione.
9898
````
9999

100-
## Funzioni richiamate
100+
## Callback functions (funzioni richiamate)
101101

102-
Diamo un occhiata ad ulteriori esempi di passaggio di funzione come valore e utilizzo di espressioni di funzione.
102+
Diamo un'occhiata ad ulteriori esempi di passaggio di funzione come valore e utilizzo della sintassi function expression.
103103

104104
Scriveremo una funzione `ask(question, yes, no)` con tre parametri:
105105

@@ -134,13 +134,13 @@ function showCancel() {
134134
ask("Do you agree?", showOk, showCancel);
135135
```
136136

137-
Prima abbiamo visto come riscrivere le funzioni in maniera più breve, da notare che nel browser (e in alcuni casi anche lato server) queste funzioni risultano molto popolari. La principale differenza tra un implementazione realistica e gli esempi sopra è solo che le funzioni reali utilizzano modalità più complesse per interagire con l'utente, non un semplice `confirm`. In ambiente browser, queste funzioni spesso mostrano delle interrogazioni molto carine. Ma questo è un altro discorso.
137+
Queste funzioni possono essere molto utili. La principale differenza tra un'implementazione realistica e gli esempi sopra è che le funzioni "reali" utilizzano modalità più complesse per interagire con l'utente, non un semplice `confirm`. In ambiente browser, queste funzioni mostrano spesso delle finestre molto carine per gli input dell'utente. Ma questo è un altro discorso.
138138

139139
**Gli argomenti `showOk` e `showCancel` della `ask` sono chiamati *funzioni di richiamo* o semplicemente *callbacks*.**
140140

141-
L'idea è che passiamo una funzione e ci aspettiamo di "richiamarla" più tardi se necessario. Nel nostro caso `showOk` diventa la callback per la risposta "yes", e `showCancel` per la risposta "no".
141+
L'idea è di passare una funzione e di "richiamarla" più tardi se necessario. Nel nostro caso `showOk` diventa la callback per la risposta "yes", e `showCancel` per la risposta "no".
142142

143-
Possiamo utilizzare un espressione di funzione per scrivere la stessa funzione più in breve:s
143+
Possiamo utilizzare una function expression per scrivere la stessa funzione più concisamente:
144144

145145
```js run no-beautify
146146
function ask(question, yes, no) {
@@ -158,60 +158,60 @@ ask(
158158
```
159159

160160

161-
Qui la funzione viene dichiarata dentro alla chiamata di `ask(...)`. Queste non hanno nome, e sono denominate *anonime*. Queste funzioni non sono accessibili dall'esterno di `ask` (perchè non sono assegnate a nessuna variabile), ma è proprio quello che vogliamo in questo caso.
161+
Qui la funzione viene dichiarata dentro alla chiamata di `ask(...)`. Queste non hanno nome, e perciò sono denominate *anonime*. Queste funzioni non sono accessibili dall'esterno di `ask` (perché non sono assegnate a nessuna variabile), ma è proprio quel che vogliamo in questo caso.
162162

163-
Questo tipo codice apparirà nei nostri script molto naturalmente, è nello spirito del JavaScript.
163+
Questo tipo di codice comparirà nei nostri script molto naturalmente: è nello spirito di JavaScript.
164164

165165

166166
```smart header="Una funzione è un valore che rappresenta un \"azione\""
167167
I valori regolari come le stringhe o i numeri rappresentano *dati*.
168168
169-
Una funzione può anche essere vista come un *azione*.
169+
Una funzione può anche essere vista come un'*azione*.
170170
171171
Possiamo passarla tra le variabili ed eseguirla quando vogliamo.
172172
```
173173

174174

175-
## Espressione di Funzioni vs Dichiarazione di Funzioni
175+
## Function expression vs Dichiarazione di Funzioni
176176

177-
Cerchiamo di elencare le differenze chiave tra Dichiarazioni ed Espressioni di Funzione.Expressions.
177+
Cerchiamo di elencare le differenze chiave tra Dichiarazioni ed Espressioni di Funzione.
178178

179-
Primo, la sintassi: come capire cosa è cosa nel codice.
179+
Primo, la sintassi: come distinguerle nel codice.
180180

181-
- *Dichiarazione di funzione:* una funzione, dichiarata come un istruzione separata, nel flusso principale del programma.
181+
- *Dichiarazione di funzione:* una funzione, dichiarata come un'istruzione separata, nel flusso principale del programma.
182182

183183
```js
184184
// Dichiarazione di funzione
185185
function sum(a, b) {
186186
return a + b;
187187
}
188188
```
189-
- *Espressione di funzione:* una funzione, creata all'interno di un espressione o all'interno di un altro costrutto. Qui, la funzione è creata alla destra dell' "espressione di assegnazione" `=`:
189+
- *Function expression:* una funzione, creata all'interno di un'espressione o all'interno di un altro costrutto. Qui, la funzione è creata alla destra dell' "espressione di assegnazione" `=`:
190190

191191
```js
192-
// Espressione di funzione
192+
// function expression
193193
let sum = function(a, b) {
194194
return a + b;
195195
};
196196
```
197197

198-
La differenza più subdola è *quando* una funzione viene creata dal motore JavaScript engine.
198+
La differenza più subdola è *quando* una funzione viene creata dal motore JavaScript.
199199

200-
**Un espressione di funzione viene creata quando l'esecuzione la raggiunge ed è utilizzabile da quel momento in poi.**
200+
**Una function expression viene creata quando l'esecuzione la raggiunge ed è utilizzabile solo da quel momento in poi.**
201201

202-
Quando il flusso di esecuzione passa alla destra dell'operatore di assegnazione `let sum = function…` -- , la funzione viene creata e può essere utilizzata (assegnata, chiamata, etc...) a partire da quel momento.
202+
Quando il flusso di esecuzione passa alla destra dell'operatore di assegnamento `let sum = function…` , la funzione viene creata e, a partire da questo momento, può essere utilizzata (assegnata, chiamata, etc...).
203203

204-
La dichiarazione di funzione si comporta diversamente.
204+
Una dichiarazione di funzione funziona diversamente.
205205

206206
**Una dichiarazione di funzione è utilizzabile nell'intero script/blocco di codice.**
207207

208-
In altre parole, quando JavaScript si *prepara* ad eseguire lo script o un blocco di codice, come prima cosa guarda le dichiarazioni di funzione contenute e le crea. Possiamo pensare a questo processo come uno "stage di inizializzazione".
208+
In altre parole, quando JavaScript si *prepara* ad eseguire lo script o un blocco di codice, come prima cosa cerca le dichiarazioni di funzione e le crea. Possiamo pensare a questo processo come a uno "stage di inizializzazione".
209209

210-
E dopo che tutte le dichiarazioni di funzione sono state processate, l'esecuzione potrà procedere.
210+
E' solo dopo che tutte le dichiarazioni di funzione sono state processate che l'esecuzione potrà procedere.
211211

212-
Come risultato, una funzione creata come dichiarazione di funzione può essere richiamata anche prima della sua definizione.
212+
Come risultato, una funzione creata tramite una dichiarazione di funzione può essere richiamata anche prima della sua definizione.
213213

214-
Ad esempio il seguente codice funziona:
214+
Ad esempio, il seguente codice funziona:
215215

216216
```js run refresh untrusted
217217
*!*
@@ -223,9 +223,9 @@ function sayHi(name) {
223223
}
224224
```
225225

226-
La dichiarazione di funzione `sayHi` viene creata quando JavaScript si sta preparando ad eseguire lo script ed è visibile in qualsiasi punto.
226+
La dichiarazione di funzione `sayHi` viene creata quando JavaScript si sta preparando ad eseguire lo script ed è visibile in ogni suo punto.
227227

228-
...Se fosse stata un espressione di funzione, non avrebbe funzionato:
228+
...Se fosse stata una function expression, non avrebbe funzionato:
229229

230230
```js run refresh untrusted
231231
*!*
@@ -237,13 +237,13 @@ let sayHi = function(name) { // (*) nessuna magia
237237
};
238238
```
239239

240-
Le espressioni di funzione sono create quando l'esecuzione le incontra. In questo esempio avverà solo alla riga `(*)`. Troppo tardi.
240+
Le espressioni di funzione sono create quando l'esecuzione le incontra. In questo esempio avverrà solo alla riga `(*)`. Troppo tardi.
241241

242-
**Quando una dichiarazione di funzione viene fatta all'interno di un blocco di codice, sarà visibile ovunque all'interno del blocco, ma non al suo esterno.**
242+
**In *strict mode*, quando una dichiarazione di funzione viene fatta all'interno di un blocco di codice sarà visibile ovunque all'interno del blocco, ma non al suo esterno.**
243243

244-
Qualche volta è comodo dichiarare funzioni locali utili in un singolo blocco. Ma questa caratteristica potrebbe causare problemi.
244+
Qualche volta è comodo dichiarare funzioni locali, utili in un singolo blocco. Ma questa caratteristica potrebbe causare problemi.
245245

246-
Ad esempio, immaginiamo di aver bisogno di dichiarare una funzione `welcome()` in base ad un parametro `age` che valuteremo a runtime. E abbiamo intenzione di utilizzarlo più avanti.
246+
Ad esempio, immaginiamo di aver bisogno di dichiarare una funzione `welcome()` (la utilizzeremo più avanti) in base ad un parametro `age` che valuteremo durante il *runtime*.
247247

248248
Il codice sotto non funziona:
249249

@@ -271,7 +271,7 @@ welcome(); // Errore: welcome non è definita
271271
*/!*
272272
```
273273

274-
Questo accade perchè una dichiarazione di funzione è visibile solamente all'interno del blocco di codice in cui è scritta.
274+
Questo accade perché una dichiarazione di funzione è visibile solamente all'interno del blocco di codice in cui è stata definita.
275275

276276
Un altro esempio:
277277

@@ -308,7 +308,7 @@ welcome(); // Errore: welcome non è definita
308308

309309
Cosa possiamo fare per rendere visibile `welcome` all'esterno del blocco `if`?
310310

311-
Il giusto approccio è quello di utilizzare un espressione di funzione ed assegnarla ad una variabile `welcome` che viene dichiarata all'esterno di `if` ed ha quindi la corretta visibilità.
311+
Il giusto approccio è quello di utilizzare una function expression ed assegnarla ad una variabile `welcome`, che viene dichiarata all'esterno di `if` ed ha quindi la corretta visibilità.
312312

313313
Ora funziona:
314314

@@ -351,17 +351,22 @@ welcome(); // ora funziona
351351
```
352352

353353

354-
```smart header="Quando conviene scegliere un dichiarazione di funzione vs espressione di funzione?"
355-
Come regola fondamentale, quando abbiamo la necessita di dichiarare una funzione, la prima opzione da considerare è la dichiarazione di funzione. Fornisce maggiore libertà sul come organizzare il codice, poichè possiamo utilizzare quella funzione anche prima della sua dichiarazione.
354+
```smart header="Quando conviene scegliere una dichiarazione di funzione piuttosto di una function expression?"
355+
Come regola fondamentale, quando abbiamo la necessità di dichiarare una funzione, la prima opzione da considerare è la dichiarazione di funzione. Fornisce maggiore libertà per quanto riguarda l'organizzazione del codice, poiché possiamo utilizzare la funzione anche prima della sua dichiarazione.
356356
357-
Risulta anche più facile vedere `function f(…) {…}` nel codice, piuttosto che `let f = function(…) {…}`. La dichiarazione di funzione è più facile da "notare".
357+
Risulta anche più facile vedere `function f(…) {…}`, nel codice, piuttosto di `let f = function(…) {…}`. La dichiarazione di funzione è più facile da individuare.
358358
359-
...Ma se per qualche ragione la dichiarazione di funzione non si applica bene al caso in questione (abbiamo visto degli esempi sopra), allora l'espressione di funzione può essere utilizzata.
359+
...Ma se per qualche ragione la dichiarazione di funzione non si applica bene al caso in questione (abbiamo visto degli esempi, sopra), allora la function expression può essere un'alternativa.
360360
```
361361

362-
## Summary
362+
## Riepilogo
363363

364+
- Le funzioni sono valori. Possono essere assegnate, copiate o dichiarate in qualsiasi punto del codice.
365+
- Se la funzione viene dichiarata come un blocco "separato" dal flusso d'esecuzione principale del codice, tale definizione viene chiamata "dichiarazione di funzione".
366+
- Se la funzione viene definita tramite un'espressione, viene chiamata "function expression".
367+
- Le dichiarazioni di funzione vengono processate prima che il blocco di codice dove sono state definite sia raggiunto.
368+
- Le function expression vengono processate quando il flusso d'esecuzione del codice principale le raggiunge.
364369

365-
Nella maggior parte dei casi quando abbiamo bisogno di dichiarare una funzione, una dichiarazione di funzione è preferibile, poichè è visibile anche prima della riga di dichiarazione. Questo ci fornisce più flessibilità nell'organizzazione del codice, e solitamente risulta più leggibile.
370+
Nella maggior parte dei casi, quando abbiamo bisogno di dichiarare una funzione una dichiarazione di funzione è preferibile poiché è visibile anche prima della sua dichiarazione. Questo ci fornisce più flessibilità nell'organizzazione del codice, e solitamente risulta più leggibile.
366371

367-
Quindi dovremmo utilizzare un espressione di funzione solo quando una dichiarazione di funzione non è adatta al caso specifico. Abbiamo visto un paio di esempi in questo capitolo, e ne vederemo altri in futuro.
372+
Dovremmo, quindi, utilizzare una function expression solo quando una dichiarazione di funzione non è adatta a un caso specifico. Abbiamo visto un paio di esempi in questo capitolo, e ne vederemo altri in futuro.

0 commit comments

Comments
 (0)