かなり興味深い問題に遭遇しました。以下のコードは、ログに記録されると値を与える配列を生成します[undefined × 1]
。this answerによると、それは配列に初期化されたインデックスがあることを意味します-この場合は1つだけです。ただし、array.push()
この種の問題を正確に回避するために使用しているだけなので、ちょっと迷っています。私の知る限り、他の初期化されたインデックスよりも少なくとも 1 つ大きいインデックスを割り当てるだけで、問題が発生する可能性があります。とにかく、ここにコードがあります:
function Thing(params) {
var that = this;
this.OtherObject = function OtherObject(param) {
this.param = param;
}
this.Foo = function Foo() {
this.bar = [];
this.add = function(item) {
if (this.bar.length != 0) {
for (var i = 0, len = this.bar.length; i < len; i++) {
if (this.bar[i].param <= item.param) {
this.bar.splice(i, 0, item);
}
}
} else {
this.bar[0] = item;
console.log(this.bar);
}
}
this.pop = function() {
return this.bar.pop();
}
this.length = function() {
return this.bar.length;
}
}
this.someFunc = function() {
var myThing = new that.Foo();
myThing.add(new that.OtherObject(3));
while (myThing.length() > 0) {
var someVar = myThing.pop();
}
}
}
var myThing = new Thing({
myParam: "someValue"
});
myThing.someFunc();
問題を絞り込むことができるかどうかを確認するためにテスト ケースを作成しましたが、コードの 95% を再入力することになり、問題が再び発生しましたmyThing.pop()
。問題の問題を示すフィドルをここで見つけることができます。
それで...何がこれを引き起こしているのかについてのアイデアはありますか? これは、実際にオブジェクトをネストした方法に問題がありますか? (これは、私の以前の質問に対するこの回答で私に与えられたパターンに従って行いました)。
ここで何をしようとしているのか疑問に思っている方のために説明すると、外側のオブジェクトを一種の名前空間のように扱っています。これは、グローバル名前空間が混乱するのを避けるために行っています (これは最終的にはパスファインディング ライブラリになります)。ここで自分の行動をまとめれば)。オブジェクトは、スタックを ing することで最も近いノード (プロパティFoo
が最も低いノード) を取得できるように、一種の順序付けられたリストであることを意図しています。param
pop()