3
var sc = new stuCore();
function stuCore() {
    this.readyPages = [];
    this.once = true;
    var self = this;

    // gets called asynchronously
    this.doPrepPage = function (page){

            if(self.once == true){
                   // still gets executed every time, assignment fails
                   self.once = false;
                   doSomeStuffOnce();
            }
    };

   this.addReadyPage = function (pageid) {

            console.log("readypage called");
            this.readyPages.push(pageid);
            if (!$.inArray(pageid, self.readyPages) != -1) {
                    this.doPrepPage(pageid);
            }
    };


}

この割り当てが失敗するのはなぜですか? jsの基本を知っていると思っていたのですが、これには困惑しています。さらに、可能な解決策は何ですか?最初にコンストラクターを呼び出して、そこに変数を設定しますか?

編集: 他のスクリプトでは次のように呼び出されます:

  sc.addReadyPage(self.id);
4

2 に答える 2

1

このjQuery.inArray関数は、指定された値を含む配列のインデックスを返します。スクリプトは、に存在するかどうかを確認する前ににプッシュpageidします。とは同じ配列参照であるため、結果は常にゼロ以上になるため、呼び出しの条件は決して実行されません。this.readyPagesself.readyPagesthis.readyPagesself.readyPagesdoPrepPage

順番を入れ替えてみてください:

this.addReadyPage = function (pageid) {
        console.log("readypage called");
        if ($.inArray(pageid, self.readyPages) != -1) {
                this.readyPages.push(pageid);
                this.doPrepPage(pageid);
        }
};

(編集: 追加の を削除しました!。@chumkiu に感謝します)

于 2012-08-03T10:07:12.120 に答える
0

私が正しく理解している場合、あなたthis.doPrepPage<insert variable name here>.doPrepPage?

この場合var self、無名関数にパススルーしてそこに格納されるため、呼び出すたびthis.doPrepPageに のローカル変数が使用されselfます。

グローバル変数に設定selfしてみてください。この方法では永続的に変更selfされるため、呼び出されるたびthis.doPrepPageに更新された変数が使用されます。

于 2012-08-03T09:59:58.713 に答える