Estos están tomados de los tutoriales de Jquery vid de tuts-premium.
http://tutsplus.com/lesson/the-this-keyword/ Jeff explica a qué se refiere "esto" cada vez, pero no estoy seguro de haber captado el razonamiento detrás de todos.4 escenarios diferentes de 'esto'. ¿Cuál es la interpretación correcta?
E.g. 1
function doSomething(e) {
e.preventDefault();
console.log(this);
}
$('a').on('click', doSomething);
En este caso, "esto se refiere al elemento 'a'" (siendo en este caso el objeto padre)
supongo que es porque aquí la declaración equivale a:
$('a').on('click', function (e) {
e.preventDefault();
console.log(this);
}
Así que 'a' es el objeto principal
Por ej. 2
var obj = {
doIt: function(e){
e.preventDefault();
console.log(this);
}
}
$('a').on('click', obj.doIt);
En este caso, "esto todavía se refiere al elemento 'a'" (* pero parece ser que no es el objeto padre?)
Parece que esta vez estamos llamando a un método, pero el declaración todavía equivale a lo mismo que Eg 1
* Una cosa en el tutorial me tiene un poco confundido. Pensé que 'esto' siempre se refiere al objeto principal, por lo que en este caso 'a' sigue siendo el objeto principal. Pero (a las 05.23 en el tutorial) infiere que no es el caso, indicando que "puede haber ocasiones en las que desee que 'esto' se refiera a su objeto principal que sería 'obj'", en cuyo caso crea e.g.3.
E.g. 3
var obj = {
doIt: function(){
console.log(this);
}
}
$('a').on('click', function(e){
obj.doIt();
};
e.preventDefault();
En este caso "Esto se refiere al objeto obj"
supongo que esto con el hecho de que 'esto' está en una función anidada como esta declaración equivale a:
$('a').on('click', function(){
function(){ console.log(this);}
};
e.preventDefault();
Realmente no entiendo por qué, particularmente cuando leo en un artículo que en funciones anidadas 'this' "pierde su camino y se refiere al objeto principal (objeto ventana)".
EG4
var obj = {
doIt: function(){
console.log(this);
}
}
$('a').on('click', function(e){
obj.doIt.call(this);
e.preventDefault();
});
En este caso "Esto se refiere a la 'a'"
Según guía definitiva Javascript "El primer argumento de ambos llamada() es el objeto sobre el cual la función debe invocarse " Aquí" este "es el usado como primer argumento. Pero "este" no es el objeto sobre el que se invocará la función?
Creo que entiendo que la función de llamada está ahí para invocar la función y usar su primer parámetro como un puntero a un objeto diferente, pero no entiendo por qué usar 'esto' significa que la función es invocada por 'a'. Tampoco es algo que haya visto en otros ejemplos de call().
Lo siento por una publicación tan mamut.Esperemos que alguien siga leyendo en esta etapa ...
+1 porque es demasiado tarde aquí para que empiece a responder a esta excelente pregunta. Sin duda, alguien más lo hará pronto: es un punto vital y generalmente está mal cubierto en los tutoriales de JS. – jimw
* "Pensé que 'esto' siempre se refiere al objeto principal ..." * No, no pienses en 'esto' como el objeto principal. Piénselo como un * contexto de llamada * cuyo valor se puede establecer de varias maneras diferentes, una de las cuales es llamar a un método desde un objeto. –