La palabra reservada: "this" - El Mundo de Angular

La palabra reservada: «this»

La palabra «this»,  es una palabra reservada en muchos lenguajes de programación, y Javascript no es la excepción. Esta palabra hace referencia al «contexto» en donde uno está parado. Usando la palabra this, se puede acceder a las variables y funciones de un «contexto» en particular. Además, dependiendo de la parte de tu código en la que estés parado, el valor de this varía, y si no sabés cuáles son las reglas de Javascript que hacen que cambie el valor de la palabra this, podés llegar a pensar que Javascript tiene un comportamiento algo «raro».

Recordemos primero qué es el Execution Context. El Execution Context son un par de «cosas» que el motor de Javascript me arma y me deja listas para usar, para facilitarme la vida. Entre esas cosas, están la variable global (si ejecutás tu código Javascript en un browser, ésta variable global es «Window»), y la palabra reservada «this«. Recordemos también que se crea un Execution Context diferente cada vez que se ejecuta una función. Es por eso que cuando ejecutemos lo siguiente en nuestro browser:


function a() {
    console.log(this); // <-- esto apunta a la variable global "Window"
}

a();

 

se creará un nuevo Execution Context, y la palabra reservada «this» tendrá el valor de la variable global.

 

Ahora bien, recordemos también que las funciones son first class y, por consiguiente, pueden ser tratadas como un tipo más de dato, es por eso que podemos definir un objeto con el atributo «log» y asignarle una variable a ese atributo:

var o = {
  name: 'objeto o',
  log: function() {
      console.log(this)
  }
}
o.log()
Entonces, ¿qué creés que vale en este caso la palabra reservada «this»?… Vale el objeto «, de hecho, lo que se imprime en consola es lo siguiente:
{name: «objeto o», log: ƒ}
Es decir, nuestro objeto previamente creado, interesante, ¿no?.

Y ahora… ¡un poco de magia!

Si tuviera el siguiente código:


var c = {
       name:'objeto c',
       log:function() {
              this.name = 'new name';
              console.log(this)
              var setname=function(newName) {
                     this.name=newName;
              }

              setname('another name')
              console.log(this);

       }
}
c.log()
console.log('outside c', name);

 

¿Cúal creés que sería el valor de «this» en esta línea?
this.name = 'new name';
Y… ¿en esta línea?
this.name = newName;
¿Ya tenés tu respuesta? ¿Seguro? Bueno, aunque para muchos ésto es considerado un «bug», para Javascript es mas bien su forma habitual de comportarse.
En la línea:
this.name = 'new name';
«this» efectivamente apunta al objeto «c», creado anteriormente.
Pero en la línea que se setea el valor «newName» (dentro de la función setname):
this.name = newName
«this», que está dentro de una función declarada con un Function Expresion, vale el objeto global: «Window». De hecho, es por eso que al ejecutar esa línea, lo que hace el motor de Javascript es asignar la variable «name» a la variable global «Window», y asignarle el valor «another name» sin modificar el atributo «name» del objeto «c«. ¿Me seguís? ¡Estamos creando una variable global y seguramente sin querer!
 
Si tenés curiosidad, ésto es lo que se imprime en consola:
{name: «new name», log: ƒ}
{name: «new name», log: ƒ}
outside c another name
Raro ¿no?. ¿Y cómo salvamos entonces esta situación? ¿cómo hacemos para que «this» siempre apunte a nuestro objeto «c«? Una forma es guardar el objeto «this» en una variable intermedia, muchas veces llamada «self» o «that«, de la siguiente forma:


var c = {
       name:'objeto c',
       log:function() {
              var self=this; //Guardamos el valor de "this" para no perderlo más adelante
              self.name ='new name';
              console.log(this)
              var setname=function(newName) {
                     self.name=newName;
              }
              setname('another name')
              console.log(self);
       }
}
c.log()


Y… ¡voilá!

 

Conclusiones

Como ves nuevamente, Javascript se sigue comportando de forma «rara», bueno, no tanto, sólo un poquito. Así que anotá en tu lista de cosas raras la palabra reservada «this». ¡Y mucho cuidado cuando la usás!

About the Author

Mi nombre es Gustavo Hernán Dohara, soy Ingeniero en Sistemas y, sobre todas las cosas, soy un apasionado por la tecnología; tengo más de 10 años de experiencia en diferentes tecnologías y he decidido compartir mis conocimientos y experiencias con cualquiera que desee aprender: alumnos, empleados, freelancers y vos. Al ritmo que cada uno pueda, en el horario en que cada uno pueda y en el lugar que cada uno elija.

 ¡OFERTA! 

 101 Preguntas Sobre javascript

Que te Harán En Cualquier Entrevista (Con Sus Respuestas)