首先说明一下错误写法每次都弹出5的原因:
其实原因就是每次循环里,第一个i是确定赋值了的,而第二个i,由于它本身处在一个函数定义中,在真正被调用之前他都会随着循环计数器中的i的变化而变化。
如果想让每个循环绑定的函数弹出的i是不一样的i,就要在定义之后立即执行,而不是等弹出的时候所有i走了一遍,i就已经变成5了。
也就是说,在函数定义里的变量,是会变的。要想让他变成某个具体的数,就要在当他等于那个具体的值时立即执行它。
在想要i是某个值时立即执行它,也就是变成下面这样:
但这样会导致页面一加载就执行每个循环里面的函数,连续弹出1,2,3,4。
所以就想了个办法,让每次循环中的函数都在这个循环里执行:
这里,虽然click事件绑定的
里,m依然是会随着外面的m的变化而变化的,但外面的m,在每个循环里都立即执行了一次,也就是说赋给绑定在click事件上的m的是每次都不同的。
for(var i=1;i<=4;i++){
//给下面这行的i叫“第一个i”
$("#addShopCar"+i).click(function () {
//给下面这行的i叫“第二个i”
alert(i);
})
}
如果想让每个循环绑定的函数弹出的i是不一样的i,就要在定义之后立即执行,而不是等弹出的时候所有i走了一遍,i就已经变成5了。
也就是说,在函数定义里的变量,是会变的。要想让他变成某个具体的数,就要在当他等于那个具体的值时立即执行它。
在想要i是某个值时立即执行它,也就是变成下面这样:
for(var i=1;i<=4;i++){
$("#addShopCar"+i).click((function () {
alert(i);
})());
}
所以就想了个办法,让每次循环中的函数都在这个循环里执行:
for(var i=1;i<=4;i++){
(function (m) {
$("#addShopCar"+i).click(function () {
alert(m);
});
})(i);
}
function () {
alert(m);
}