W poniższym przykładzie znalazłem nieoczekiwaną wartość tego słowa kluczowego:
let x = {
z : 10 ,
get func1() {
return function(v) {
console.log(this === v);
}
}
}
x.func1(x)
Wartością tego słowa kluczowego jest obiekt x, tak jakby został wykonany z tego obiektu, oczekuję, że tylko funkcja get, która ma to słowo kluczowe, jest równa obiektowi wywołującemu x
ten przykład pokazuje nam różnicę
let x = {
func2() {
return function(v) {
console.log(this === v);
}
}
}
x.func2()(x);
W obu przykładach func1, która jest funkcją gettera, i func2, która jest metodą obiektu, są wykonywane z obiektu x , a następnie zwracana funkcja jest wykonywana. Dlaczego więc ta wartość w pierwszym przykładzie nie jest równa obiektowi globalnemu zamiast obiektowi x .
javascript
getter-setter
Kirollos Nasr
źródło
źródło
x.func1()
.Odpowiedzi:
To bardzo interesujące pytanie.
Jest tak, ponieważ funkcja jest wywoływana natychmiast po uzyskaniu dostępu do właściwości. Są to zasadniczo równoważne:
W obu przypadkach:
Fakt, że
func1
jest to właściwość akcesorium ifunc2
właściwość danych, nie ma znaczenia. Liczy się sposób, w jaki używana jest wartość wynikająca z odczytu właściwości.źródło
x.func1
zachowuje odniesieniex
jako kontekst dla następnego wywołania, w przeciwieństwie dox.func2()
(z twojego pytania), które ocenia również funkcję, ale nie jest wyrażeniem dostępu do członka.x.func2()(x);
?x.func1(x)
ix.func2()(x)