Controllo di sintassi
Qual’è il risultato di questo codice?
let user = {
name: "John",
go: function() { alert(this.name) }
}
(user.go)()
P.S. C’è una trappola :)
Errore!
Provatelo:
let user = {
name: "John",
go: function() { alert(this.name) }
}
(user.go)() // error!
La maggior parte dei browser non vi darà informazioni necessarie per capire cosa è andato storto.
L’errore viene causato dalla mancanza di un punto e virgola dopo user = {...}
.
JavaScript non inserisce automaticamente un punto e virgola prima di (user.go)()
, quindi leggerà il codice in questo modo:
let user = { go:... }(user.go)()
Possiamo anche vedere questa come una comune espressione, è sintatticamente una chiamata all’oggetto { go: ... }
come una funzione con argomento (user.go)
. E questo avviene nella stessa riga di let user
, quindi l’oggetto user
non è ancora stato definito, quindi c’è un errore.
Se inseriamo un punto e virgola, tutto funziona correttamente:
let user = {
name: "John",
go: function() { alert(this.name) }
};
(user.go)() // John
Da notare che le parentesi su (user.go)
non fanno nulla. Solitamente servono ad organizzare l’ordine delle operazioni, in questo caso è presente un .
che verrebbe comunque eseguito per primo, non hanno quindi alcun effetto. L’unico errore stava nel punto e virgola.