2

さて、これは複雑なので、私に耐えるようにしてください、私はそれをできるだけ単純に保つようにします:

私は「クラス」構造体を持っています。これは、Javascript内のArrayBuffersに適用する「構造体のような」スケルトンを作成します。問題は、構造体に他の構造体を含めることを許可するという「c」のような動作を模倣しようとしている場合です。

問題は、呼び出し元のメソッドのイテレータ(明らかにクロージャの問題)を壊してしまうことです。これは理解できないようです。

混乱するコードの例を次に示します(うまくいけば、これで答えを得るのに十分なコードです。そうでない場合は、必要に応じてさらに追加し、無関係なコードをここに入れないようにします)。

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));

クラスメソッドapplyBufの最初の構造体を反復処理すると、構造体スケルトン内の各アイテムで__createFromBufが呼び出されます。アイテムが別の構造体の場合、__ createFromBufは、他の「構造体スケルトン」オブジェクトでapplyBufを呼び出し、その構造体のインスタンスをに返します。意図したとおりに機能する呼び出し構造体。

JSFIDDLE-これが実際の例へのリンクです:)

4

1 に答える 1

1

forステートメントをクリーンアップします。

適切に宣言されていない場合、forループインデックスはグローバルメンバーになります。

デモンストレーション:

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

for (var item in strctObj) // item is scoped within the loop's owner function
于 2012-04-10T08:21:03.703 に答える