2016-04-19 9 views
1

Angenommen, ich deklariere eine Variable namens foo in der Bereit-Funktion. Normalerweise werden lokal deklarierte Variablen gelöscht, wenn die Funktion richtig endet?Wie werden Variablen korrekt gespeichert, ohne sie global zu speichern?

Ich möchte diese Variable im Ereignis-Listener von #someid verwenden. Ich habe dies versucht und die foo Variable ist immer noch zugänglich, wenn ein Klick-Ereignis auf #someid auftritt.

Warum ist diese Variable nicht zerstört und immer noch zugänglich, wenn die Bereit-Funktion endet? Ist es sicher, eine Variable zu deklarieren und so zu verwenden? Ich möchte die Variable nicht global deklarieren, wie ich es nicht getan habe.

EDIT: Wo sind diese Ereignislistener und ihre Variablen gespeichert?

Hier ist meine js:

$(document).ready(function() { 
var foo = 0; 

//random event listener 
$('#someId').on('click', function() { foo++; }); //increment foo 

}); 
+3

Related: [Wie funktioniert JavaScript-Schließungen?] (Http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) –

+0

'foo' ist in der lokalen' Geltungsbereich' von '$ (Dokument) .ready 'was ist der Elternbereich für' click-handler' Variablen im 'outer-scope' der' Funktion' sind in der 'Funktion' zugänglich – Rayon

+0

Willkommen bei SO! Außerdem gibt es in dem von Ihnen bereitgestellten Code keine globalen Variablen. – evolutionxbox

Antwort

5

ich diese Variable in den Ereignis-Listener von '#someid' verwenden möchten. Ich habe das versucht und die foo-Variable ist immer noch zugänglich, wenn ein Klick-Ereignis auf '#someid' auftritt.

Dies ist korrekt, Ihre Variable foo ist immer noch im Umfang und daher zugänglich.

Warum ist diese Variable nicht zerstört und immer noch zugänglich?

Da beide im Rahmen der Bereit-Funktion sind.

Ich möchte die Variable nicht global deklarieren.

Sie haben nicht, also keine Sorge. Sie haben eine Variable deklariert, die lokal für die Bereit-Funktion und nicht global ist.

+0

Ja, aber die Ready-Funktion wird nur einmal ausgeführt. Und nach der Ausführung einer Funktion werden alle lokalen Variablen gelöscht. Aber der Ereignis-Listener wird mehrfach ausgeführt und verwendet eine gelöschte Variable, oder liege ich falsch? Wenn der Ereignis-Listener definiert ist, wird die foo-Variable kopiert oder etwas? – Benjistep

+0

** bitte lernen Sie Schließungen **.Closures sind genau das, dass Variablen ** nach dem Beenden des Funktionsaufrufs ** nicht gelöscht werden, solange es noch eine Referenz ** auf sie gibt. wie eine andere Funktion, die sie verwendet, und selbst durch den Event-Listener referenziert wird, auf den der Knoten verweist, an den er angehängt ist, auf den das DOM verweist. Solange also eine solche Kette vom globalen Objekt zu Ihrer Variablen existiert, wird sie nicht gelöscht. Aaaaaund diese Variable ist * nicht statisch *, sie gehört zu diesem bestimmten Funktionsaufruf. – Thomas

+0

danke, diese Antwort hat geholfen! – Benjistep

Verwandte Themen