Questi sono presi dai tutor di Jquery tutor-tuts premium.
http://tutsplus.com/lesson/the-this-keyword/ Jeff spiega a cosa si riferisce ogni volta, ma non sono sicuro di aver afferrato il ragionamento che sta dietro a tutti.4 diversi scenari di "questo". Qual è l'interpretazione corretta?
E.g. 1
function doSomething(e) {
e.preventDefault();
console.log(this);
}
$('a').on('click', doSomething);
In questo caso "questo si riferisce alla 'un' elemento" (essendo in questo caso l'oggetto padre)
Credo che sia perché qui la dichiarazione equivale a:
$('a').on('click', function (e) {
e.preventDefault();
console.log(this);
}
Quindi 'a' è l'oggetto padre
Es. 2
var obj = {
doIt: function(e){
e.preventDefault();
console.log(this);
}
}
$('a').on('click', obj.doIt);
In questo caso "questo si riferisce ancora al 'un' elemento" (* ma a quanto pare non è l'oggetto padre?)
Sembra che questa volta stiamo chiamando un metodo, ma la la dichiarazione equivale ancora alla stessa cosa di Eg 1
* Una cosa nel tutorial mi ha un po 'confuso. Pensavo che "questo" si riferisse sempre all'oggetto genitore, quindi in questo caso "a" è ancora l'oggetto genitore. Ma (alle 5.23 del tutorial) deduce che non è il caso, affermando "ci possono essere delle volte in cui si desidera che" questo "si riferisca al suo oggetto genitore che sarebbe" obj "" nel qual caso crea a.g.g.3.
E.g. 3
var obj = {
doIt: function(){
console.log(this);
}
}
$('a').on('click', function(e){
obj.doIt();
};
e.preventDefault();
In questo caso "Questo fa riferimento all'oggetto obj"
presumo questo per il fatto che 'questo' è una funzione nidificata come questa affermazione equivale a:
$('a').on('click', function(){
function(){ console.log(this);}
};
e.preventDefault();
In realtà non capisco perché, soprattutto perché ho letto in un articolo che nelle funzioni annidate "questo" "perde la sua strada e si riferisce all'oggetto principale (oggetto finestra)".
EG4
var obj = {
doIt: function(){
console.log(this);
}
}
$('a').on('click', function(e){
obj.doIt.call(this);
e.preventDefault();
});
In questo caso "Questo si riferisce al 'un'"
Secondo JavaScript Definitive Guide "Il primo argomento sia chiamata() è l'oggetto su cui la funzione deve essere invocata " Qui" questo "è l'usato come primo argomento. Ma "questo" non è l'oggetto su cui la funzione deve essere invocata ??
Penso di ottenere che la funzione di chiamata sia lì per richiamare la funzione e utilizzare il suo primo parametro come puntatore a un oggetto diverso, ma non capisco perché usare "questo" significa che la funzione è invocata da "a". Non è qualcosa che ho visto in altri esempi call().
Scusate per un post così mastodontico.Spero che qualcuno stia ancora leggendo in questa fase ...
+1 perché è troppo tardi qui per me iniziare rispondere a questa eccellente domanda. Non c'è dubbio che presto arriverà qualcun altro - è un punto vitale ed è generalmente trattato male nei tutorial di JS. – jimw
* "Ho pensato 'questo' si riferisce sempre all'oggetto genitore ..." * No, non pensare a 'this' come l'oggetto genitore. Consideralo come un * contesto di chiamata * il cui valore può essere impostato in diversi modi, uno dei quali è la chiamata a un metodo da un oggetto. –