1

背景:ウェブサイトで使用する必要のある操作(スムーズモーション関数など)に対してステップタイプのイベントを実装するために
呼び出されるjavascriptオブジェクトを作成しました。StepStepオブジェクトのメソッドを使用して、各ステップを実行する関数を登録できますregisterFunction(func)

ステップごとに関数の実行を処理するために、Stepオブジェクトには。と呼ばれる別のメソッドがありrun()ます。このメソッドでは、登録されている関数のリストを実行し、それらを実行してから関数呼び出しsetTimeout(...)、実行関数への参照を渡して次のステップで呼び出します。

問題:
最初の「ステップ」は、私のhtmlページの<body>タグのonloadイベント(属性)によって実行されます(ただし、間接的に:Step.runによって呼び出される関数によってinitiateJS()呼び出され onloadます)。最初のステップでは何も問題はありません。ただし、2番目のステップまでに、Stepオブジェクト内の変数は破棄されたように見えます。それらはすべて未定義になります。

質問:
ガベージコレクターが原因かもしれないと思っていましたか?多分それはどういうわけかその参照を失いますか?
また、setTimeout(...)ステップタイプのイベント実装を作成するための最良の方法を使用していますか?

詳細:
Stepオブジェクトは、jsドキュメントで次のように宣言されています。

    var Step = {
            myVars: "somevalues",
            anArray: [],
            run: function() {
                //run the registered functions
                setTimeout(this.run,this.interval);
        };

また、次のステップでは、Stepオブジェクトはまだ存在しています。

その他のマイナーな詳細:

  • Chromeを使用しています
  • XAMPPをフルに使ってウェブサイトを作成しています
  • 私はWindows7を使用しています
  • 4

    2 に答える 2

    1

    run関数を次のように変更します。

    run: function() {
        var that = this;
        setTimeout(that.run, that.interval);
    }
    

    setTimeout関数は変数を再定義しthisます。これは、この問題を回避するために私が考えることができる最も簡単な方法です。

    于 2012-05-03T22:54:36.170 に答える
    1

    setTimeoutグローバルコンテキストでコードを実行します。this次回のrun()実行時に定義されなくなりました。ある種のグローバルオブジェクトで変数を宣言するか、実行関数自体に参照を渡すために、コードをリファクタリングする必要があります。

    編集:あなたStepがグローバルであると言ったので、これはうまくいくはずです:

    run: function() {
        //run the registered functions
        setTimeout(Step.run, Step.interval);
    }
    
    于 2012-05-03T22:58:16.617 に答える