Il valore di questa parola chiave di una funzione restituita da un getter


15

Ho trovato un valore imprevisto di questa parola chiave nell'esempio seguente:

let x = {
    z : 10 ,
    get func1() {
        return function(v) {
            console.log(this === v);
        }
    }
}


x.func1(x)

Il valore di questa parola chiave è l'oggetto x come se fosse eseguito da quell'oggetto, mi aspetto che solo la funzione get che abbia questa parola chiave sia uguale all'oggetto chiamante x

questo esempio ci mostra la differenza

let x = {
    func2() {
        return function(v) {
            console.log(this === v);
        }
    }
}

x.func2()(x);

In entrambi gli esempi, func1, che è la funzione getter, e func2, che è un metodo dell'oggetto, vengono eseguiti dall'oggetto x e la funzione restituita viene quindi eseguita. Quindi perché questo valore nel primo esempio non è uguale all'oggetto globale invece che all'oggetto x .


3
Domanda davvero interessante. Non avevo mai pensato a questa ruga prima.
TJ Crowder,

1
" Come se fosse eseguito da quell'oggetto " - ma è eseguito su quell'oggetto, proprio lì: x.func1().
Bergi,

Risposte:


13

Questa è una domanda molto interessante.

È perché la funzione viene chiamata immediatamente sul risultato di un accesso alla proprietà. Quindi questi sono fondamentalmente equivalenti:

let x = {
    get func1() {
        return function(v) {
            console.log(this === v);
        };
    },
    func2(v) {
        console.log(this === v);
    }
};

x.func1(x);
x.func2(x);

In entrambi i casi:

  1. Viene letto il valore della proprietà, risultante in un riferimento alla funzione.
  2. Tale funzione viene eseguita come parte della stessa espressione di accesso alla proprietà.

Il fatto che func1sia una proprietà accessor ed func2una proprietà data non ha importanza. È importante il valore che deriva dalla lettura della proprietà.


1
Ho pensato che l'intera espressione verrà valutata sull'oggetto funzione e quindi eseguita. Grazie capito
Kirollos Nasr il

1
@KirollosNasr Sì, ma nell'espressione x.func1mantiene il riferimento xcome contesto per la chiamata successiva, in contrasto con x.func2()(dalla tua domanda) che valuta anche una funzione ma non è un'espressione di accesso del membro.
Bergi,

1
@Bergi - Penso che volevi dire x.func2()(x);?
TJ Crowder,

1
@TJCrowder Sì, mi riferisco alle espressioni all'interno x.func1(x)ex.func2()(x)
Bergi il

1
@Bergi sì, ha una parte difficile. Ma ora è più chiaro Grazie a TJ Crowder e a te
Kirollos Nasr il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.