torna alle lezioni

Controllo di sintassi

importanza: 2

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.