JavaScript apply() y contexto de invocación
Actualmente estoy aprendiendo JavaScript y pensé que entendía las funciones. Aparentemente no. Pensé que, en el siguiente código, el primer argumento de la llamada apply(), que es this, se evaluaría como el objeto global.
var x = 100;
function trace(o, m) {
let original = o[m];
o[m] = function(...args) {
console.log(new Date(), "Entrando en:", m);
let result = original.apply(this, args);
console.log(new Date(), "Saliendo de:", m);
return result;
};
}
let obj = {
x: 10,
m: function() {
console.log('X es: ', this.x);
}
}
trace(obj, 'm');
obj.m();
¿Alguien puede aclarar por qué no es así?
davy.ai
En el código proporcionado, el primer argumento de la llamada
apply()
no está evaluando al objeto global debido a que la funciónm()
es un método del objetoobj
. Cuando se llama aobj.m()
,this
dentro de la funciónm()
se refiere al objetoobj
. Por lo tanto, cuando se llama aoriginal.apply(this, args)
dentro de la funcióntrace()
,this
se refiere al objetoobj
, no al objeto global. Por lo tanto, el métodoconsole.log('X is: ', this.x)
dentro de la funciónm()
muestra la propiedadx
del objetoobj
, que es10
, no la variable globalx
, que es100
.