在for循环中,Jquery赋值失败

时间:2011-09-30 02:02:07

标签: javascript jquery for-loop unassigned-variable

我有一个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

任何想法?

3 个答案:

答案 0 :(得分:3)

嗯,你说它是“unassigned”但是我猜这个函数不是你想做的。

这是一个常见问题。您在循环中创建的所有函数都引用相同的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]

答案 1 :(得分:0)

$(“slide-1”+ i).show(2000)是拼写错误还是错误?

答案 2 :(得分:0)

var slide = [];循环上方添加for