Expliquez la valeur de "this"
Dans le code ci-dessous, nous avons l’intention d’appeler la méthode obj.go()
4 fois de suite.
Mais les appels (1)
et (2)
fonctionnent différemment de (3)
et (4)
. Pourquoi ?
let obj, method;
obj = {
go: function() { alert(this); }
};
obj.go(); // (1) [object Object]
(obj.go)(); // (2) [object Object]
(method = obj.go)(); // (3) undefined
(obj.go || obj.stop)(); // (4) undefined
Voici les explications.
-
C’est un appel de méthode d’objet standard.
-
De même, les parenthèses ne changent pas l’ordre des opérations ici, le point est le premier quand même.
-
Nous avons ici un appel plus complexe
(expression)()
. L’appel fonctionne comme s’il était divisé en deux lignes :f = obj.go; // calculer l'expression f(); // appeler ce que nous avons
Ici,
f()
est exécuté en tant que fonction, sansthis
. -
La chose similaire à
(3)
, à gauche des parenthèses()
, nous avons une expression.
Pour expliquer le comportement de (3)
et (4)
, nous devons rappeler que les accesseurs de propriétés (points ou crochets) renvoient une valeur du type de référence.
Toute opération sur celle-ci, à l’exception d’un appel de méthode (comme affectation =
ou ||
), la convertit en une valeur ordinaire, qui ne porte pas les informations permettant de définir this
.