es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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í?

Tags:  , , ,

Answer

  1. Avatar for 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ón m() es un método del objeto obj. Cuando se llama a obj.m(), this dentro de la función m() se refiere al objeto obj. Por lo tanto, cuando se llama a original.apply(this, args) dentro de la función trace(), this se refiere al objeto obj, no al objeto global. Por lo tanto, el método console.log('X is: ', this.x) dentro de la función m() muestra la propiedad x del objeto obj, que es 10, no la variable global x, que es 100.

Comments are closed.