Explica el valor de "this"
En el código siguiente intentamos llamar al método obj.go()
4 veces seguidas.
Pero las llamadas (1)
y (2)
funcionan diferente a (3)
y (4)
. ¿Por qué?
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
Aquí está la explicación.
-
Esta es una llamada común al método del objeto
-
Lo mismo, aquí los paréntesis no cambian el orden de las operaciones, el punto es el primero de todos modos.
-
Aquí tenemos una llamada más compleja
(expression)()
. La llamada funciona como si se dividiera en dos líneas:f = obj.go; // Calcula la expresión f(); // Llama a lo que tenemos
Aquí
f()
se ejecuta como una función, sinthis
. -
Lo mismo que
(3)
, a la izquierda de los paréntesis()
tenemos una expresión.
Para explicar el funcionamiento de (3)
y (4)
necesitamos recordar que los accesores de propiedad (punto o corchetes) devuelven un valor del Tipo de Referencia.
Cualquier operación en él excepto una llamada al método (como asignación =
o ||
) lo convierte en un valor ordinario que no transporta la información que permite establecer this
.