zoukankan      html  css  js  c++  java
  • 循环绑定多个事件--闭包

    首先说明一下错误写法每次都弹出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的是每次都不同的。
  • 相关阅读:
    P1410 子序列
    P1395 会议 (树形dp)
    P2580 于是他错误的点名开始了
    LC1127. 用户购买平台
    LC 1308. Running Total for Different Genders
    P1340 兽径管理 (最小生成树)
    P1330 封锁阳光大学 (二分图染色)
    CF1296F Berland Beauty (Tree, dfs/bfs, LCA)
    顺丰的Cookie条款
    服务器判断客户端的用户名和密码(token的身份验证)
  • 原文地址:https://www.cnblogs.com/Jasonellen/p/5777605.html
Copyright © 2011-2022 走看看