J'ai trouvé une valeur inattendue de ce mot clé dans l'exemple suivant:
let x = {
z : 10 ,
get func1() {
return function(v) {
console.log(this === v);
}
}
}
x.func1(x)
La valeur de ce mot clé est l'objet x comme s'il était exécuté à partir de cet objet, je m'attends à ce que seule la fonction get qui a ce mot clé soit égale à l'objet appelant x
cet exemple nous montre la différence
let x = {
func2() {
return function(v) {
console.log(this === v);
}
}
}
x.func2()(x);
Dans les deux exemples, func1, qui est la fonction getter, et func2, qui est une méthode de l'objet, sont exécutés à partir de l'objet x , et la fonction renvoyée est ensuite exécutée. Alors pourquoi cette valeur dans le premier exemple n'est pas égale à l'objet global au lieu de l'objet x .
javascript
getter-setter
Kirollos Nasr
la source
la source
x.func1()
.Réponses:
Voilà une question très intéressante.
C'est parce que la fonction est appelée immédiatement sur le résultat d'un accès à la propriété. Ce sont donc fondamentalement équivalents:
Dans les deux cas:
Le fait qu'il
func1
s'agisse d'une propriété d'accesseur et d'func2
une propriété de données n'a pas d'importance. C'est la façon dont la valeur résultant de la lecture de la propriété est utilisée qui compte.la source
x.func1
il conserve la référencex
comme contexte pour l'appel suivant, contrairement àx.func2()
(d'après votre question) qui évalue également une fonction mais n'est pas une expression d'accès membre.x.func2()(x);
?x.func1(x)
etx.func2()(x)