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条)

报告相同问题?

悬赏问题

  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振