2012-07-20 13 views
13

Perché non è possibile utilizzare direttamente this anziché self nell'esempio seguente?Perché abbiamo bisogno di "var self = this" nelle classi in Javascript?

function SeatReservation(name, initialMeal) { 
    var self = this; 
    self.name = name; 
    self.meal = ko.observable(initialMeal); 
} 

Dopo le risposte, ho imparato:

Sì, non è necessario se non c'è cambio di contesto in classe.

Ma userò questo approccio come "convenzione" anche se non ce n'è bisogno.

risposta

21

Non c'è alcun motivo per cui non è possibile utilizzare this direttamente lì (e direi che sarebbe meglio per migliorare la leggibilità se fatto).

Tuttavia, il var self = this; è spesso necessaria in situazioni come le seguenti (in pratica, qualsiasi azione asincrono come evento vincolante, gestori di AJAX, ecc, dove la risoluzione di this è differito fino è uguale a qualcos'altro);

function SeatReservation(name, initialMeal) { 
    var self = this; 
    self.name = name; 
    self.meal = ko.observable(initialMeal); 

    setTimeout(function() { 
     alert(self.name); // otherwise, this is window; use self to keep a reference to the "SeatReservation" instance. 
    }, 100); 
} 
+0

Vuol setTimeout run nel costruttore? O è un metodo di classe? – ozz

+0

@ozz: consultare la documentazione di ['window.setTimeout'] (https://developer.mozilla.org/en/DOM/window.setTimeout); ritarda l'esecuzione della funzione fornita per il numero di millisecondi specificato. – Matt

+0

Per non parlare, setTimeout consente anche di passare un parametro. per esempio http://jsfiddle.net/gRoberts/rYB3f/ che nel tuo esempio rimuoverebbe la necessità di ridichiarare 'this' come' self'. – Gavin

3

In base all'esempio, c'è "no" motivo per farlo.

C'è tuttavia, situazioni in cui ti aiuterà, anche se alcuni potrebbero disapprovare il suo utilizzo.

cioè

$('a.go').click(function(e) 
{ 
    e.preventDefault(); 
    if(!$(this).hasClass('busy')) 
    { 
     $(this).addClass('busy'); 
     $.ajax(
     { 
      success : function(resp) 
      { 
       $(this).removeClass('busy'); 
      }, 
      error : function() 
      { 
       $(this).removeClass('busy');     
      } 
     }); 
    } 
}); 

In quanto sopra, $(this) entro il successo e di errore callback non rifletterebbe il link che hai selezionato, come il campo di applicazione è stata persa.

Per aggirare il problema, si farebbe var self = $(this) cioè

$('a.go').click(function(e) 
{ 
    e.preventDefault(); 
    if(!$(this).hasClass('busy')) 
    { 
     $(this).addClass('busy'); 
     var btn = $(this); 
     $.ajax(
     { 
      success : function(resp) 
      { 
       btn.removeClass('busy'); 
      }, 
      error : function() 
      { 
       btn.removeClass('busy');     
      } 
     }); 
    } 
}); 
+5

sebbene tu sia naturalmente corretto dal punto di vista tecnico, risposte come questa mi preoccupano un po ': ** jQuery! = Javascript **!Rispondere a un'ampia domanda in javascript con la sintassi di jQuery può essere fonte di confusione per i principianti. – cypherabe

+0

Tuttavia, i principianti imparano raramente il javascript nativo, ma tendono a cercare su Google una soluzione, che nella maggior parte dei casi si traduce nell'uso di jQuery. È un'arma a doppio taglio. Se avessi dato un esempio javascript nativo, qualcuno che conosce solo javascript basato su jQuery sarebbe confuso. – Gavin

+0

JQuery IS javascript nativo. Tuttavia, non è la gestione DOM nativa. La confusione è profonda. – frostymarvelous

5

Nel codice esempio, non v'è nessuna ragione al mondo per copiare this a una variabile.

Viene in genere utilizzato quando il codice utilizza un metodo di richiamata. All'interno del metodo di callback this non fa riferimento all'oggetto, quindi si utilizza la variabile per quello.

7

Di solito è fatto per mantenere un riferimento a questo quando il contesto sta cambiando. Viene spesso utilizzato in gestori di eventi o funzioni di callback. Ma come accennato prima, non vi è alcun motivo per utilizzarlo nel tuo esempio specifico.

Troverete maggiori dettagli nel seguente articolo: http://www.alistapart.com/articles/getoutbindingsituations

Problemi correlati