我无法弄清楚这个范围问题:
var menuLinks = new Array("about.php", "contact.php");
function setClickListeners()
{
for(var i=0; i<menuItems.length; i++)
{
$("#" + menuItems[i]).click( function () {
window.alert(menuLinks[i]);
});
}
}
注意:menuItems和menuLink的长度相同。这个代码被剥离,以便更容易理解。
单击项目时此代码的结果是警报“未定义”。它应该是来自menuLinks的数据。
帮助!
弗兰克
答案 0 :(得分:8)
for (var i=0; i < menuItems.length; i++) {
(function(i) {
$("#"+menuItems[i]).click(function() {
alert(menuLinks[i]);
});
}(i));
}
您需要在i
中为您的匿名函数设置.click
本地的当前值。
JavaScript只有函数范围。因此,如果您没有将i
设为本地,那么每当您按下时,i
的值就是当前值,在这种情况下为menuItems.length - 1
。
您在上面做的是创建一个新的功能范围并将i
的值传递给它,以便i
的当前值在该功能范围内保持不变。这样你的点击函数就会从闭包中获取i
的常量值。
<强>的JSLint 强>
让代码复杂化并满足jslint。
var wrapper = function(i) {
$("#"+menuItems[i]).click(function() {
alert(menuLinks[i]);
});
};
for (var i=0; i < menuItems.length; i++) {
wrapper(i);
}
答案 1 :(得分:1)
更干净的代码:
var menuLinks = new Array("about.php", "contact.php");
function setClickListeners()
{
$.each(menuLinks, function(i, element)
{
$("#" + menuItems[i]).click( function (e) {
alert(menuItems[i]);
e.preventDefault();
});
}
}