2009-10-30 5 views
5

C'è qualcuno che sa come distruggere una funzione javascript (jquery)? Sto usando jquery "selezionabile" e una chiamata di funzione "edit" viene attivata sull'evento "stop" selezionabile.distrugge una funzione in javascript (jquery)

All'interno di questa funzione "modifica" ho nidificato funzioni di commutazione con un sacco di eventi "click" e ho molte funzioni all'interno di ciascun evento "click". Il mio problema è, ogni volta che si attivano le funzioni "selezionabili" e gli eventi all'interno della funzione "modifica" vengono nuovamente attivati, ma le funzioni e gli eventi precedenti esistono ancora. Quello che faccio ora è di dissipare ogni evento nella funzione "modifica" anche su "start" selezionabile.

Si tratta di un problema di perdita di memoria? e c'è un modo per "distruggere" le funzioni in javascript? Ho provato a dichiarare la funzione su null quando la funzione termina ma questo non funziona. esistono ancora funzioni ed eventi al suo interno.

qualcuno ha un indizio?

pagina demo qui -> http://dreamerscorp.com/test/test01/javascript_destory_test.html

modificare 2009/10/31 :) grazie mille per il vostro aiuto, i vostri commenti sono molto utili per me, grazie ancora !!!

+0

+1 per la pagina demo! –

+0

Sì, un altro +1 per la pagina demo. –

risposta

3

Fondamentalmente è necessario rimuovere tutti i riferimenti a tali funzioni in modo che il garbage collector di JavaScript possa raccoglierli. Se sono vincolati, è necessario separarli. Se ci sono altre variabili lì che puntano a loro, devono essere impostate su null.

Potrebbe essere utile se hai postato del codice; allora possiamo dare una risposta migliore.

... EDIT:

Che cosa sta accadendo qui è, si sta creando una chiusura che sopravviverà la funzione di contenimento:

function edit(){ 
     $('.edit').click(function(){ 
     //... 
     function _edit(boxTitle,selectedItemAmount){ 
      //... 
      $('#box .yes').click(function(){ 
      alert(boxTitle + ' for ' + selectedItemAmount + ' selected item'); 
      $('#msg').hide(); // hide msg box when yes btn is clicked 
      }); 
     } 
     //... 
     $('#box .no').click(function(){ 
      $('#msg').hide(); 
     }); 
     }); 

In altre parole, all'interno di una funzione, è' dicendo "Collega questa funzione a un oggetto DOM" e lo stai facendo in linea. JavaScript cattura le variabili dai contesti esterni e li mantiene in vita mentre il riferimento al contesto interno è vivo.

Quello che dovete fare è quello di definire le funzioni da qualche parte non in linea e poi usarli:

function boxClickYes(e) { 
     alert(e.data.boxTitle + ' for ' + e.data.selectedItemAmount + 
     ' selected item'); 
     $('#msg').hide(); // hide msg box when yes btn is clicked 
    } 
    function boxClickNo(e) { 
     $('#msg').hide(); 
    } 
    function edit(){ 
     $('.edit').click(function(){ 
     //... 
     function _edit(boxTitle,selectedItemAmount){ 
      //... 
      $('#box .yes').bind("click", {boxTitle: boxTitle, 
      selectedItemAmount: selectedItemAmount}, boxClickYes); 
     } 
     //... 
     $('#box .no').click(boxClickNo); 
     }); 

Questo dimostra anche come utilizzare la proprietà data in jQuery clic gestori per memorizzare i dati tra il momento in cui collegare il gestore e il tempo di utilizzo (anziché archiviare i dati in una chiusura che manterrà la catena dell'oscilloscopio in memoria). L'uso di funzioni definite in linea va bene quando lo si utilizza proprio lì (ad esempio il corpo di un $.each), ma non è corretto quando si collegano i gestori di eventi.

+0

http://dreamerscorp.com/test/test01/javascript_destory_test.html codice di esempio qui :) quindi vuoi dire che devo separare ogni evento all'interno della funzione e impostare tutte le funzioni su null? – ben

+0

grazie !!! questa è una demo molto buona !! molto utile!! – ben

+0

Prego. –

7

Si può cercare di annullare la funzione, o ignorare che l'assegnazione di una funzione anonima che non fa nulla:

myFunction = null; 
// or 
myFunction = function() {}; 

È anche possibile farlo all'interno della funzione stessa:

var autoDestroy = function() { 
    autoDestroy = null; 
    //... 
    return 1; 
}; 

autoDestroy(); // returns 1 
autoDestroy(); // TypeError: autoDestroy is not a function 
+0

Design molto intelligente! –

+0

Non penso che stia davvero chiedendo come distruggere una funzione; piuttosto, sta chiedendo come districare i riferimenti che lo fanno rimanere nella memoria. –

+0

@Anthony: Sì, penso che abbiamo bisogno di vedere il suo codice per dare una risposta precisa – CMS

1

Per "distruggere" una funzione in javascript, è sufficiente assicurarsi che la funzione diventi irraggiungibile. Ciò consentirà alla funzione di essere idonea per la bonifica. Una cosa da tenere a mente è che le variabili javascript sono legate in base agli ambiti (non come variabili individuali) e un ambito, con molti oggetti non utilizzati, può persistere se un legame è mantenuto nell'ambito:per fornire ulteriore assistenza richiede conoscenza del codice specifico e di come viene utilizzato.

Vedere l'operatore di cancellazione javascript come un modo per rimuovere una variabile o un membro dell'oggetto. L'impostazione del valore su null/undefined/other-object rimuove il metodo di raggiungere l'oggetto a cui si fa riferimento in precedenza (anche se potrebbe essere ancora raggiungibile altrimenti non può essere recuperato) ma non elimina la variabile/membro.

delete variable 
delete obj.member 
delete obj[member] 
+0

grazie per l'aiuto, ho appena provato a utilizzare "elimina" la funzione, ma esistono ancora funzioni e variabili all'interno delle funzioni eliminate. il seguente codice di esempio :) http://dreamerscorp.com/test/test01/ javascript_destory_test.html – ben

+0

@ben Non capisco cosa intendi per esistenza ancora in questo caso. * Il fatto che l'esistenza possa essere valutata come positiva implica che gli oggetti non sono idonei per la bonifica * (il che implica che esistano ...) Esiste un modo particolare in cui questo viene testato? Qual è il risultato desiderato? –

+0

perdonami per la mia scarsa conoscenza di javascript. ciò che intendo per funzioni esiste ancora perché si trovano in un evento "click" e l'evento "click" si trova in una funzione chiamata "edit" che è sotto l'evento "stop" selezionabile (vedere codice demo). quindi ogni volta che seleziono il fuoco ci sarà un nuovo gestore di handler in memoria. Ho provato a declamare la funzione "modifica" come nulla o usando l'operatore "cancella" ma non ha funzionato. Penso che il mio problema sia simile a quello che ha detto Anthony Mills. Non dovrei usare funzioni definite inline per collegare gestori di eventi.grazie per l'aiuto :) – ben

6

Per separare gli eventi in utilizzare jQuery funzione unbind http://docs.jquery.com/Events/unbind

$("something").click(function() { 
    $("anotherOne").click(function() { 
     .... 
    }); 
}); 

in questo esempio, ogni volta che "qualcosa" viene cliccato, un gestore di eventi viene aggiunto "anotherone", quindi se si fa clic su tre tempi, riceverai tre gestori di eventi.

$("something").click(function() { 
    $("anotherOne").unbind('click').click(function() { 
     .... 
    }); 
}); 

qui è garantito avere un solo gestore di clic su "anotherOne".

Non è necessario distruggere il gestore precedente in modo esplicito.

+0

facendo questo se ho delle funzioni in $ ("anotherOne"). Unbind ('click'). Click (function() {// functions here}); esistono ancora? Voglio dire, "unbind" rimuove l'evento o rimuove sia l'evento che le funzioni all'interno dell'evento? – ben

+0

grazie mille !!! Penso che questo abbia risolto i miei problemi :) – ben

+1

e che cosa dire della funzione "uno" di jquery: $ ("qualcosa"). uno ("clic", funzione() { $ (this) .one ("clic", funzione() { }); }); Eseguirà una volta per ogni elemento abbinato e mai più. http://docs.jquery.com/Events/one –