2009-10-30 2 views
5

Gibt es jemanden, der weiß, wie man eine Javascript (jquery) Funktion zerstört? Ich benutze jquery "auswählbar" und ein Funktionsaufruf "bearbeiten" wird auf wählbare "Stop" Ereignis ausgelöst.eine Funktion in Javascript (jquery) zerstören

Innerhalb dieser "Edit" -Funktion habe ich Schaltfunktionen mit vielen "Klick" -Ereignissen verschachtelt und ich habe viele Funktionen innerhalb jedes "Klick" -Ereignisses. Mein Problem ist, jedes Mal fire ich die "auswählbaren" Funktionen und Ereignisse innerhalb der Funktion "bearbeiten" wird erneut ausgelöst, aber die vorherigen Funktionen und Ereignisse bestehen noch. Was ich jetzt mache ist, jedes Ereignis in der Funktion "bearbeiten" auf auswählbare "Start" gerade zu lösen.

Ist dies ein Speicherverlustproblem? und gibt es eine Möglichkeit, Funktionen in Javascript zu "zerstören"? Ich habe versucht, die Funktion auf Null zu deklarieren, wenn die Funktion endet, aber das funktioniert nicht. Funktionen und Ereignisse in ihm existieren noch.

Wer hat eine Ahnung?

Demo-Seite hier -> http://dreamerscorp.com/test/test01/javascript_destory_test.html

bearbeiten 2009.10.31 :) Vielen Dank für Ihre hilft, um Ihre Kommentare zu mir sehr nützlich sind, nochmals vielen Dank !!!

+0

+1 für die Demoseite! –

+0

Ja, ein weiteres +1 für die Demoseite. –

Antwort

3

Grundsätzlich müssen Sie um alle Verweise auf diese Funktionen zu entfernen, damit der JavaScript-Garbage Collector sie erfassen kann. Wenn sie gebunden sind, müssen Sie sie lösen. Wenn dort andere Variablen sind, die auf sie zeigen, müssen sie auf Null gesetzt werden.

Es könnte hilfreich sein, wenn Sie einen Code gepostet haben; dann können wir eine bessere Antwort geben.

... EDIT:

Was hier passiert ist, bist du einen Verschluss zu schaffen, der die Funktion enthält, wird überleben:

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(); 
     }); 
     }); 

Mit anderen Worten, in einer Funktion, Sie‘ sagen, "diese Funktion an ein DOM-Objekt anhängen", und Sie tun es inline. JavaScript erfasst Variablen aus äußeren Kontexten und hält sie am Leben, während der Verweis auf den inneren Kontext lebendig ist.

Was Sie tun müssen, ist es, die Funktionen zu definieren irgendwo nicht inline und sie dann verwenden:

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); 
     }); 

Dies zeigt auch, wie die Dateneigenschaft zu verwenden, in jQuery Klick-Handler zwischen der Zeit, um Daten zu speichern in Sie Fügen Sie den Handler und die Zeit, in der Sie ihn verwenden, an (anstatt diese Daten in einem Closure zu speichern, der die Umfangskette im Speicher hält). Inline-definierte Funktionen zu verwenden ist in Ordnung, wenn Sie es gerade dort verwenden (wie zum Beispiel der Körper einer $.each), aber es ist nicht OK, wenn Sie Event-Handler anhängen.

+0

http://dreamerscorp.com/test/test01/javascript_destory_test.html Beispielcode hier :) Sie meinen ich muss jedes Ereignis innerhalb der Funktion lösen und alle Funktionen auf Null setzen? – ben

+0

danke !!! Das ist eine sehr gute Demo !! sehr hilfreich!! – ben

+0

Gern geschehen. –

7

Sie können versuchen, die Funktion zunichte zu machen, oder sie überschreiben eine anonyme Funktion zuweisen, die nichts tut:

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

Sie es auch tun können, selbst in der Funktion:

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

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

Sehr schlaues Design! –

+0

Ich glaube nicht, dass er wirklich fragt, wie man eine Funktion zerstört; Vielmehr fragt er, wie man die Referenzen entwirren kann, die dafür sorgen, dass sie im Gedächtnis bleiben. –

+0

@Anthony: Ja, ich denke, wir müssen seinen Code sehen, um eine genaue Antwort geben – CMS

1

Um eine Funktion in Javascript "zu zerstören", stellen Sie einfach sicher, dass die Funktion nicht erreichbar ist. Dies ermöglicht, dass die Funktion für eine Wiederherstellung infrage kommt. Eine Sache, auf die man achten sollte, ist, dass Javascript-Variablen basierend auf Bereichen gebunden sind (nicht als einzelne Variablen) und ein Bereich mit vielen nicht verwendeten Objekten bestehen kann, wenn eine Bindung an den Bereich beibehalten wird:, um weitere Hilfe bereitzustellen Kenntnis des spezifischen Codes und seiner Verwendung.

Bitte beachten Sie den JavaScript-Löschoperator als eine Möglichkeit, eine Variable oder ein Objektelement zu entfernen. Wenn Sie den Wert auf null/undefined/other-object setzen, wird die Methode des Erreichens des Objekts, auf das zuvor verwiesen wurde, entfernt (obwohl es möglicherweise noch erreichbar ist und daher nicht zurückgewonnen werden kann), aber die Variable/member wird nicht gelöscht.

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

danke für die Hilfe, ich habe gerade versucht mit "löschen" die Funktion, aber Funktionen und Variablen innerhalb der gelöschten Funktionen existieren noch .. Folgendes ist der Beispielcode :) http://dreamerscorp.com/test/test01/ javascript_destory_test.html – ben

+0

@ben Ich verstehe nicht, was Sie meinen, in diesem Fall noch existieren. * Die Tatsache, dass die Existenz als positiv getestet werden kann, impliziert, dass die Objekte nicht zur Reklamation berechtigt sind * (was bedeutet, dass sie existieren ...) Gibt es eine bestimmte Art und Weise, wie diese getestet wird? Was ist das gewünschte Ergebnis? –

+0

entschuldigen Sie mich für meine schlechten Kenntnisse von Javascript. was ich meine, ist, dass Funktionen noch existieren, weil sie sich in einem "Klick" -Ereignis befinden und das "Klick" -Ereignis in einer Funktion namens "Bearbeiten" ist, die unter wählbarem "Stopp" -Ereignis ist (siehe Demo-Code). Jedes Mal, wenn ich auswähle, wird ein neuer Handler-Speicher im Speicher vorhanden sein. Ich habe versucht, die "Edit" -Funktion als Null oder den "Löschen" -Operator deklamieren, aber es hat nicht funktioniert. Ich denke, mein Problem ist wie das, was Anthony Mills gesagt hat. Ich sollte keine inline-definierten Funktionen verwenden, um Event-Handler anzuhängen.danke für die hilfe :) – ben

6

Veranstaltungen in jquery Verwendung unbind Funktion unbind http://docs.jquery.com/Events/unbind

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

in diesem Beispiel wird jedes Mal "etwas" angeklickt wird, wird ein Event-Handler "AnotherOne" hinzugefügt, wenn Sie also drei klicken Mal, Sie erhalten drei Event-Handler.

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

Hier haben Sie garantiert nur einen Klick-Handler auf "anotherOne".

Es ist nicht notwendig, vorherige Handler explizit zu zerstören.

+0

indem ich das mache, wenn ich Funktionen in $ ("anotherOne") habe. Unbind ('click'). Click (function() {// funktioniert hier}); Gibt es sie noch? Ich meine, löst "unbind" nur das Ereignis oder entfernt es sowohl das Ereignis als auch die Funktionen innerhalb des Ereignisses? – ben

+0

vielen Dank !!! Ich denke, das löste meine Probleme :) – ben

+1

Was ist mit der Verwendung von jQuery "One" -Funktion: $ ("etwas"). one ("click", function() { $ (this) .one ("click", Funktion ( }); Es wird einmal für jedes passende Element und nie wieder ausgeführt. http://docs.jquery.com/Events/one –

Verwandte Themen