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 :)
welche Fehler hat die Konsole sagen? – Joseph
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
können Sie eine einfache Funktionsdemo zur Verfügung stellen, die den Fehler wiederholen kann? vielleicht in einer Geige? – Joseph