jo0ger 2015-12-28 12:28 采纳率: 60%
浏览 1566
已采纳

js 回调函数的一个疑惑


$(document).ready(function(){ for(var i = 0 ; i < 5; i++){ $("#b"+i).bind("click",function(){ alert(i); }); } });


This is a paragraph.

请点击这里0
请点击这里1
请点击这里2
请点击这里3
请点击这里4

代码如上,很简单的一个循环。但是为什么这5个button点击后都是alert出5呢
为什么不是0,1,2,3,4呢?难道是回调的执行顺序的问题?求大神解答

  • 写回答

3条回答 默认 最新

  • 谁用了我的英文名 2015-12-28 15:29
    关注

    @wuheng_1 正解
    这是闭包法则带来的结果。

    $(document).ready(
        function(){ 
                //形成闭包
                for(var i = 0 ; i < 5; i++){
                    //在这里定义了变量i
                    $("#b"+i).bind("click",function(){
                            //内部函数调用了变量i
                            alert(i); 
                        });
                }
                //假如在这里继续改变i的值,那么你会发现alert的值继续发生改变
            });
    //问题的关键在于内部方法使用了外部方法的变量i
    

    就这个问题而言,当然是有解决办法的,思路1,放弃id选择器,把id当成一个属性,然后利用startWith过滤器选择到这些东西,然后each枚举通过解析id的具体值来完成事件的绑定。
    思路2,定义一个返回值为function的js方法,然后把i作为参数传进去。然后在绑定中调用此方法获取绑定事件的具体执行方法(可能说的不是很清楚,直接函数片段)

    //思路一
    $("*[id^='b']).each(function(index, data){
        var i = $(data).id().substring(1);
        $(data).bind("click", function(){alert(i);});
    });
     //思路二
     function(){ 
                var getFun = function(canshu){return alert(canshu);};
                for(var i = 0 ; i < 5; i++){
                    $("#b"+i).bind("click", getFun(i));
                }
            });
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源