retour au cours

Vérification de la syntaxe

importance: 2

Quel est le résultat de ce code ?

let user = {
  name: "John",
  go: function() { alert(this.name) }
}

(user.go)()

P.S. Il y a un piège :)

Erreur!

Essayez le :

let user = {
  name: "John",
  go: function() { alert(this.name) }
}

(user.go)() // error!

Le message d’erreur dans la plupart des navigateurs ne permet pas de comprendre ce qui s’est mal passé.

L’erreur apparaît parce qu’un point-virgule est manquant après user = {...}.

JavaScript n’insert pas automatiquement un point-virgule avant une accolade (user.go)(), il lit donc le code comme ceci :

let user = { go:... }(user.go)()

Ensuite, nous pouvons également voir qu’une telle expression conjointe est syntaxiquement un appel de l’objet { go: ... } en tant que fonction avec l’argument (user.go). Et cela se produit également sur la même ligne avec let user, alors que l’objet user n’a même pas encore été défini, d’où l’erreur.

Si nous insérons le point-virgule, tout va bien :

let user = {
  name: "John",
  go: function() { alert(this.name) }
};

(user.go)() // John

Veuillez noter que les parenthèses autour de (user.go) ne font rien ici. Habituellement, elles configurent l’ordre des opérations, mais ici le point . fonctionne toujours en premier de toute façon, donc aucun effet. Seul le point-virgule compte.