3

これを行うと正しく機能するjqueryがあります:

var slide = [];
slide[1] = 
    {
        hide: function() {
            $("#slide-1").hide();
        },
        show: function() {
            $("#slide-1").show(2000);
        }
    };
slide[1].show(); <<< works fine

しかし、ループで試してみると失敗します:

for (var i=1; i <= totalSlides; i++) {
  slide[i] = 
    {
        hide: function() {
            $("#slide-" + i).hide();
        },
        show: function() {
            $("#slide-" + i).show(2000);
        }
    };
};
slide[1].show();  << unassigned

何か案が?

4

3 に答える 3

3

さて、あなたはそれが「割り当てられていない」と言っていますが、私は関数があなたが望むことをしていないだけだと推測しています。

これは一般的な問題です。ループで作成しているすべての関数は、同じi変数を参照しています。これは、関数が実行されると、ループが終了した後iに残った場所の値を取得していることを意味します。

ループからの値を保持するには、関数が参照する変数を新しい変数環境でスコープする必要があります。そのためには、関数を呼び出し、その関数に現在のi値を参照させる必要があります。

このような:

function generate_functions( j ) {
     //    v----- DO NOT place the opening brace on the next line, after the
    return {              // return statement, or your code will break!!!
        hide: function() {
            $("#slide-" + j).hide();
        },
        show: function() {
            $("#slide-" + j).show(2000);
        }
    };
}

var slide = [];

for (var i=1; i <= totalSlides; i++) {

    slide[i] = generate_functions( i );

};

slide[1].show(); // should work

と呼ばれる関数を作成し、引数としてgenerate_functions()渡して、各反復でそれを呼び出しました。i

generate_functions()パラメータとして値を受け取ったことに気付くでしょうj。それを呼び出すこともできますiが、名前を変更すると、IMOが少し明確になります。

これで、関数はローカルを参照していますj。を呼び出すたびに新しい変数環境が作成されるため、generate_functions()作成する内部の関数は、その特定の変数環境jの値を参照します。

したがって、は、新しい各変数環境で作成された関数を含むオブジェクトをgenerate_functions() 返し、そのオブジェクトはに割り当てられslide[i]ます。

于 2011-09-30T02:11:27.933 に答える
0

$( "slide-1" + i).show(2000)はタイプミスですか、それともエラーですか?

于 2011-09-30T02:06:58.970 に答える
0

ループvar slide = [];の上に追加します。for

于 2011-09-30T02:07:30.023 に答える