Ich habe im folgenden Beispiel einen unerwarteten Wert dieses Schlüsselworts gefunden:
let x = {
z : 10 ,
get func1() {
return function(v) {
console.log(this === v);
}
}
}
x.func1(x)
Der Wert dieses Schlüsselworts ist das Objekt x, als ob es von diesem Objekt ausgeführt wird. Ich erwarte nur die Funktion get , die es gibt dieses Schlüsselwort hat, dem aufrufenden Objekt x entspricht
Dieses Beispiel zeigt uns den Unterschied
let x = {
func2() {
return function(v) {
console.log(this === v);
}
}
}
x.func2()(x);
In beiden Beispielen werden func1, die die Getter-Funktion ist, und func2, die eine Methode des Objekts ist, vom Objekt x ausgeführt , und die zurückgegebene Funktion wird dann ausgeführt. Warum entspricht dieser Wert im ersten Beispiel nicht dem globalen Objekt anstelle des Objekts x ?
javascript
getter-setter
Kirollos Nasr
quelle
quelle
x.func1()
.Antworten:
Das ist ein sehr interessante Frage.
Dies liegt daran, dass die Funktion sofort nach dem Ergebnis eines Eigenschaftszugriffs aufgerufen wird. Diese sind also grundsätzlich gleichwertig:
In beiden Fällen:
Die Tatsache, dass
func1
es sich um eine Accessor-Eigenschaft undfunc2
eine Dateneigenschaft handelt, spielt keine Rolle. Es kommt darauf an, wie der Wert verwendet wird, der sich aus dem Lesen der Eigenschaft ergibt.quelle
x.func1
wird der Verweisx
als Kontext für den nachfolgenden Aufruf beibehalten , im Gegensatz zux.func2()
(aus Ihrer Frage), die ebenfalls eine Funktion auswertet, aber kein Mitgliedszugriffsausdruck ist.x.func2()(x);
?x.func1(x)
undx.func2()(x)