循环绑定多个事件--闭包

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

也就是说,在函数定义里的变量,是会变的。要想让他变成某个具体的数,就要在当他等于那个具体的值时立即执行它。

在想要i是某个值时立即执行它,也就是变成下面这样:
        for(var i=1;i<=4;i++){
            $("#addShopCar"+i).click((function () {
                alert(i);
            })());
        }
但这样会导致页面一加载就执行每个循环里面的函数,连续弹出1,2,3,4。
所以就想了个办法,让每次循环中的函数都在这个循环里执行:
        for(var i=1;i<=4;i++){
            (function (m) {
                $("#addShopCar"+i).click(function () {
                    alert(m);
                });
            })(i);
        }
这里,虽然click事件绑定的
function () {
     alert(m);
}
里,m依然是会随着外面的m的变化而变化的,但外面的m,在每个循环里都立即执行了一次,也就是说赋给绑定在click事件上的m的是每次都不同的。
原文地址:https://www.cnblogs.com/Jasonellen/p/5777605.html