2009-03-05 17 views
1

Hat jemand eine Erklärung, wie Javascript dies tun könnte. Irgendwie ist diese Funktion zur selben Zeit wahr und falsch. Dies ist nur ein Durchlauf, keine Schleifen oder so.Javascript: Dies ergibt gleichzeitig wahr und falsch! Was ist los?

console.log(key); 
    if (this.watches.get(key)) { 
     console.log("found it"); 
    } else { 
     console.log("whhhat?"); 
    } 
    console.log(this.watches); 

Firebug Konsole Protokolle wie es ist.

search-key 
found it 
Object search-key=Object $family=Object 
whhhat? 
Object search-key=Object $family=Object 

[EDIT] Hier ist sie. Das vollständige Skript und der obige Block der Ausgabe ist Kopieren und Einfügen von Firebug. Das ist das Seltsamste, was ich je gesehen habe. http://snipt.org/Hkl

Ich benutze Mootools Framework so das this.watches = $ H ({}); ist eine Hashtabelle. Ich benutzte ein Array und hatte genau das gleiche Problem, dann wechselte ich zu $ ​​H ({}), weil ich dachte, ich würde etwas falsch machen.

+0

wirklich?/Können Sie das überprüfen? ... ist das der genaue Code? – eglasius

+0

Ihre Ausgabe macht keinen Sinn, wenn Sie nur EINEN Durchgang machen; Wenn es nur in einem Durchgang durchlaufen wird, sollte die Konsole nicht die Ausgabe des Objekts "object search-key = [...]" zweimal ausgeben. –

+0

Daniel, ich weiß, deshalb ist dieser Code hier. –

Antwort

9

Wenn dies

Object search-key=Object $family=Object 

hergestellt wird durch:

console.log(this.watches); 

Dann ist diese offensichtlich nicht nur ein Durchgang.

Das soll nicht heißen, dass es in einer Schleife oder irgendetwas ist, nur dass dieser Code mehr als einmal aufgerufen wird.

Man könnte sagen,

warum Suche-Schlüssel wird dann nur einmal angezeigt?

Die Antwort ist: Wir wissen es nicht wirklich, weil wir nicht den ganzen Code sehen.

Das wahrscheinlichste Szenario ist, dass key in der zweiten Mal ist die leere Zeichenkette

versuchen console.log("") es nichts druckt

auch diese versuchen:

>>> console.log(""); console.log(1); console.log(""); console.log(2) 

die Ausgabe kopieren und einfügen in einem beliebigen Texteditor (d. hfügen Sie es als Klartext)

1 
2 

es sieht aus wie gab es nichts zwischen 1 und 2, obwohl die Konsole tut ein Stichwort von einer leeren Zeile zeigen, aber diese Cue verschwindet, wenn Sie copy-paste die Ausgabe als Nur-Text.

UPDATE

gut, wenn dieser Prozess durch den Aufruf zu WCHistory.implement(..) initiiert wird, und diese Methode zweimal aufgerufen wird, dann offensichtlich, das zweite Mal aus irgendeinem Grunde, ist der Schlüssel leer.

Versuchen Sie, diese

ändern console.log(key)-console.log("key: " + key) und Sie sollten etwas sehen:

key: search-key 
found it 
Object search-key=Object $family=Object 
key: 
whhhat? 
Object search-key=Object $family=Object 
+0

Wenn es zwei Durchgänge gibt, dann ist unerklärlich, wie "Suchschlüssel" nur einmal ausgegeben wird. –

+0

gleiche Antwort wie Kanonade ... falsch übrigens, der Code ist sicher unvollständig dh Suchschlüssel würde 2 mal erscheinen (oder undefined oder was auch immer) – eglasius

+0

Daniel, weil der Code unvollständig ist, wissen wir nicht, wie das console.log funktioniert möglicherweise druckt es nichts, weil es keinen Suchschlüssel gibt – hasen

1

Ich denke die Antwort ist, dass dies nicht nur ein Pass ist.

Dies sieht aus wie der Code zweimal aufgerufen wird, dann das zweite Mal mit einem leeren Schlüssel. Wahrscheinlich müssen Sie mehr Code sehen, um sicher zu gehen.

Ich denke, Sie könnten eine Integer-Zählung vor der if-Anweisung inkrementieren, um diese Hypothese zu bestätigen.

+0

Das dachte ich auch zuerst, aber der "Suchschlüssel" wird nur einmal ausgegeben ... Auch wenn er leer war, spuckte er eine leere Zeile ins Logbuch. Etwas über all das summiert sich nicht. : P –

+0

Vereinbart mit Daniel, es scheint wirklich, es ist nicht der ganze Code ... – eglasius

+0

Würde es immer noch eine leere Zeile ausgeben, wenn Null an das Protokoll übergeben wird? –

0

Notwendigkeit, mehr Kontext zu sehen. Ist dies in einem Event-Handler? Was ist das'?? warum ist diese Frage mit "quantum" markiert?

0

ändern Code-Snippet, das zu sehen, ob es tatsächlich zweimal, aber aus irgendeinem Grund genannt wird, , die console.log(key) gibt beim zweiten Mal nichts aus.

console.log("====="); 
console.log(key); 
if (this.watches.get(key)) { 
    console.log("found it"); 
} else { 
    console.log("whhhat?"); 
} 
console.log(this.watches); 

Dann werden Sie die Ausgabe:

===== 
search-key 
found it 
Object search-key=Object $family=Object 
===== 
whhhat? 
Object search-key=Object $family=Object 

Wenn Sie die Ausgabe:

===== 
search-key 
found it 
Object search-key=Object $family=Object 
whhhat? 
Object search-key=Object $family=Object 

dann bin ich falsch, und ich werde die Antwort (oder mehr entfernen wahrscheinlich macht es Gemeinschaft Wiki so andere werden nicht den gleichen Weg folgen).