2008-11-27 23 views
9

ich Problem mit dem folgenden Javascript habe -Zugriff auf globale Variablen in einem Rückruf

var bVisited = false; 

function aFuncCallBack(somestring) 
{ 
    bVisited = true; 
} 

processingManager.setCallBack(aFuncCallBack); 
processingManager.DoWork(); 

if(bvisited == false) 
    alert("Call back not entered"); 

aFuncCallBack Treffer in meinem Fall bekommt; Ich setze die bVisited auf true dort - aber immer noch, wenn ich die Variable nach dem DoWork Aufruf den Wert überprüfen, ist immer noch false - Ich bin nicht in der Lage, herauszufinden, was das Problem ist. Ich suchte nach einigen Threads, fand aber nichts Relevantes.

Könnte jemand etwas Licht darauf werfen, warum dieses Verhalten und möglicherweise was soll ich tun?

Antwort

12

Wird der Callback asynchron ausgeführt? Versuchen Sie, einen alert() in den Rückruf einzufügen und zu sehen, ob er vor Ihrer bestehenden Warnung ausgelöst wird.

Wenn es einige seltsame Umfang, was los ist (sollte nicht sein, aber man weiß ja nie) Sie können Globals Zugriff auf das Fenster-Objekt: window.bVisited = true;

Bearbeiten: Sie bvisited == false überprüfen statt bVisited == false - hoffentlich ist, dass ein Tippfehler in deiner Frage und nicht im Code!

4

Wenn processingManager.DoWork(); asynchron ist, ist es möglich, dass es zurückkehren kann, bevor bVisited gesetzt wurde.

Auch Sie haben in Ihrem Test bvisited, nicht bVisited - ist das ein Schnitt & Einfügen von Ihrem Code?

0

Wie die anderen darauf hingewiesen, ist JavaScript Groß-und Kleinschreibung, und nicht deklarierte Variablen sind undefiniert, dh. 0/false/null standardmäßig.
Eine gemeinsame Gotcha mit dynamischen Sprachen ohne so etwas wie use strict/option explicit oder ähnliche Richtlinien ...

0

sorry, es ist eigentlich ein Tippfehler auf bvisited - und meine Frage war wirklich die Zustände zu speichern -

i Art von das Problem für mich herausgefunden, nachdem ich diese Frage geschrieben - das Problem aufgrund asynchroner Berufung -

wie jemand darauf hingewiesen -

> Wenn processingManager.DoWork(); asynchron ist es möglich, dass es zurückgeben kann, bevor bVisited gesetzt wurde. >

ja, ist processingManager.DoWork ein asynchroner Aufruf - und meine js bis zum Abschluss ausgeführt wird, bevor bvisited wieder einen Aufruf auf true gesetzt ist durch -

so -, die in mir noch einen Zweifel schafft - sind globale Variablen in allen js-Dateien sichtbar? Die Bedeutung, die sagen, als Teil meiner Ausführung, i zwei js Dateien haben -

1.js
// CODE bVarGlobal1 = true // CODE

erste 1.js ausgeführt wird, und dann 2 .js wird verarbeitet

Hier kann 2.js auf die Variable bVarGlobal1 in irgendeiner Weise zugreifen? (Müssen wir irgendeine "Export" Art von Schlüsselwort der Variablen bVarGlobal1 im 1.js voranstellen, so dass die Variable während der gesamten Laufzeit des Programms sichtbar ist?)

PS: Ich komme aus C/C++ Hintergrund und neu zu Javascript so entschuldigen Sie mich über das "Export" Schlüsselwort, wenn solch eine Sache in JS nicht existiert :)

+0

Sie können das als eine getrennte Frage fragen, aber die kurze Antwort ist ja, alles herein Datei 1 wird in Datei 2 sichtbar sein. – Benry