2009-06-25 8 views
7

ho qualcosa di simile a questo:Come posso mantenere il contesto di 'questo' in jQuery

var Something = function(){ 
    this.render = function(){}; 
    $(window).resize(function(){ 
    this.render(); 
    }); 
} 

Il guaio è che all'interno della funzione anonima 'questo' fa riferimento all'oggetto finestra. So che potrei fare qualcosa di simile:

var Something = function(){ 
    this.render = function(){}; 
    var tempThis = this; 
    $(window).resize(function(){ 
    tempThis.render(); 
    }); 
} 

ma c'è un modo migliore? Questo non sembra molto elegante.

+1

È necessario inserire una "var" prima di "tempThis = this" per garantire un ambito corretto. – Matt

risposta

14

La soluzione che avete trovato è la la più persone usano. La convenzione comune è chiamare la tua tempThis variabile "that".

var Something = function(){ 
    this.render = function(){}; 
    var that = this; 
    $(window).resize(function(){ 
    that.render(); 
    }); 
}; 
+3

+1 per quello (: – peirix

+0

avere una convenzione lo fa sembrare più elegante :) Mi piace "quello". – disc0dancer

+0

+1 per quello = questo -> Questo è il metodo più elegante che abbia mai trovato per questa domanda. – Nordin

2

Sembra la tua migliore opzione, non penso che ci sia un modo migliore. (qualcuno corregge il mio se sbaglio).

+0

+1 distaccato. – jrharshath

0

Ho fatto in questo modo in molte situazioni strette. Non sembra elegante, ma non fallisce mai. In realtà, le chiusure javascript in azione.

JRH

0

Questo è esattamente quello che faccio. Non è specifico nemmeno per jQuery.

var Construct = function() { 
    var self = this; //preserve scope 

    this.materials = 2000; 

    this.build = function(){ 
     self.materials -= 100; 
    }; 
}; 

Ricordarsi di utilizzare la parola chiave var davanti alla nuova variabile scope. Altrimenti, stai creando una nuova variabile globale. Come variabile locale, sarà comunque accessibile all'interno della funzione interna tramite una chiusura.

0

La soluzione migliore, per mantenere le variabili al minimo sarebbe utilizzare il metodo Function.prototype.bind().

var Something = function(){ 
    this.render = function(){}; 
    $(window).resize(this.render.bind(this)); 
} 

Il problema con questo metodo che può causare complicazioni future, il che significa che si dovrebbe scegliere di utilizzare con parsimonia, è quando si ha bisogno di invocare $(this) per afferrare l'elemento. Quindi, potrei suggerire che varrebbe la pena utilizzare Function.prototype.bind() nel metodo di ridimensionamento, ma non sarebbe una buona soluzione utilizzarlo in una funzione di clic che potrebbe aver bisogno di indirizzare direttamente l'elemento cliccato.

Vedere questo JSFiddle per un esempio funzionante.

Vedere la Mozilla Documentation on Function.prototype.bind() per ulteriori informazioni

Gli altri metodi sono utilizzabili, ma la creazione di una variabile per mantenere il contesto di questo è l'effetto indesiderato in base alla tua domanda.

Problemi correlati