我有一个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
任何想法?
答案 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
。