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 回答