2012-04-10 5 views
2

Okay, so ist dies kompliziert ist, so versuchen Sie, mit mir zu tragen, ich werde versuchen, es zu halten, so einfach wie möglich:Javascript Object aufrufen andere Objekt Brech Iterator

Ich habe eine „Klasse“ Struct, die eine schafft " struct like "skeleton für ArrayBuffer in Javascript anwenden. Das Problem ist, wenn ich versuche, das "c" -ähnliche Verhalten nachzuahmen, das einer Struktur erlaubt, andere Strukturen zu enthalten.

Das Problem ist, dass es den Iterator der aufrufenden Methode (offensichtlich ein Schließungsproblem), die ich nicht scheinen kann, klotzt. Hier

ist ein Beispiel für den Code, der verprügelt wird (hoffentlich genug Code ist die Antwort zu bekommen, wenn ich nicht mehr als nötig hinzufügen werde, nur Fremd Code zu halten versuchen, hier aus):

function StructObject(){ 
this.applyBuf = function(buf, start){ 
    var struct = {}; 
    for (obj in this){ 
     //problem is here: 
     console.log(obj); //prints "c" on the way in 
     struct[obj] = this[obj].__createFromBuf(); 
     console.log(obj); //prints "foo" (see the structs below) 
    } 
    return struct; 
} 
} 


function struct(strctObj, name){ 
var structObject = new StructObject(); 
... 
//create the skeleton 
for (item in strctObj){ 
//the specific code that fails me 
structObject[item].__createFromBuf = function(buf, pos){ 
      return structs[this.name].applyBuf(buf, pos); 
} 
... 
//store the skeleton for later application 
structs[name] = structObject; 
} 


//Creating structs looks like this: 
new struct({ foo: type.INT }, "bar"); 
new struct({ 
    a: type.INT, //defines size of memory (like c's sizeof) 
    b: type.LONG, 
    c: {type: type.STRUCT, name: "bar"}, 
    d: type.SHORT}, "myStruct"); 

structs.myStruct.applyBuf(new ArrayBuffer(35)); 

Wenn ich durch die erste Struktur der Klassenmethode applyBuf iteriere, ruft es __createFromBuf für jedes Element innerhalb des Strukturskeletts auf, wenn das Element eine andere Struktur ist __createFromBuf ruft applyBuf für das andere "struct skeleton" -Objekt auf und gibt eine Instanz dieser Struktur zurück zurück zur aufrufenden Struktur, die wie beabsichtigt funktioniert.

JSFIDDLE - Hier ist der Link zu einem Arbeitsbeispiel :)

+0

welche Fehler hat die Konsole sagen? – Joseph

+0

Der Fehler ist, dass obj in der Schleife innerhalb von StructObject zu einem Feld aus dem anderen Objekt wird, zum Beispiel im obigen Code, bevor __createFromBuf aufgerufen wird, obj == "c", aber nach seinem aufgerufenen obj == "foo" was a ist Feld von dem anderen Objekt. Danach sind jegliche Referenzen, die auf diesem [obj] basieren, undefiniert, ich kann es mit einem lahmen Hack beheben, aber ich würde eher herausfinden, wie man den richtigen Typ von Schließung macht (der Hack besteht darin, den Wert des Feldes vor dem zu speichern rufen Sie an und ersetzen Sie es nach der Rückkehr) – Ryan

+0

können Sie eine einfache Funktionsdemo zur Verfügung stellen, die den Fehler wiederholen kann? vielleicht in einer Geige? – Joseph

Antwort

1

Reinigen Sie Ihren for Aussagen:

wenn sie nicht richtig erklärt, die for Schleifenindex wird ein globales Mitglied.

Demonstration:

for (item in strctObj) // item becomes a global member 

for (var item in strctObj) // item is scoped within the loop's owner function 
+0

Nochmals vielen Dank, Javascript ist nicht mein starker Bereich, aber ich habe es gearbeitet viel zu viel, in letzter Zeit habe ich den ganzen Tag den Kopf darauf geknallt, ich dachte, es wäre ein Schließungsproblem. – Ryan

+0

sicher, danke für die anerkennung. Beachten Sie auch den Kommentar, den ich zuvor gemacht habe - achten Sie auf das Schlüsselwort 'this', dessen Entsprechung in anderen Sprachen (wie C oder Java) sich nicht auf die gleiche Weise verhält. Sie können weiterlesen im [quirksmode Artikel zum Thema] (http://www.quirksmode.org/js/this.html). –

+0

danke, ja, ich mache diesen Fehler oft genug, aber es ist normalerweise nicht so schlecht, console.log (das ist mein bester Freund (LOL, bis ich eine Art von sich selbst referenzierenden Objekt Lmao) – Ryan

Verwandte Themen