【问题标题】:Jquery does not quite work inside for loop [duplicate]Jquery 在 for 循环中不太工作 [重复]
【发布时间】:2012-12-04 01:41:32
【问题描述】:

可能重复:
Javascript: closure of loop?

我在 javascript 中有以下代码:

for (var i=0; i < images_array.length; i++) {
$('#thumb_'+ i).live('click', function(){
    $('#image_container_' + current_image_index).hide();
    current_image_index = i;
    alert(current_image_index);
    $('#image_container_' + current_image_index).show();
});}

当我点击任何拇指时,我会得到 images_array.length 值。有谁知道发生了什么?

【问题讨论】:

  • 您的 i 变量存储在本地闭包中。您需要添加另一个具有i 本地副本的函数级别。
  • 这个问题已经在 SO, Y U NO SEARCH 上回答了无数次
  • 恐怕只有了解了解决方案后才能轻松搜索。如果不了解闭包的概念,就很难知道要搜索什么......
  • @ScottSauyet:我不同意。搜索“javascript loop function”或任何包含“loop”一词的类似内容。
  • @jAndy:但为什么loop先验imageliveclickarray更显着?甚至lengthcurrenthideshow,至少出现在代码sn-p中,而loop没有。

标签: javascript jquery slider


【解决方案1】:

你需要为点击处理函数创建一个闭包,像这样:

for (var i=0; i < images_array.length; i++) {
    $('#thumb_'+ i).live('click', 
        (function(i) {
            return function(){
                $('#image_container_' + current_image_index).hide();
                current_image_index = i;
                alert(current_image_index);
                $('#image_container_' + current_image_index).show();
            }
        })(i)
    );
}

问题在于,如果没有闭包,变量会在每个处理程序函数之间共享——它会继续更新,这就是为什么每个处理程序最终都会获得 array.length 值的原因。使用闭包会创建变量 i 的本地范围副本。

这是一个展示差异的演示:

【讨论】:

  • 哦,其实我找到了另一种方法,不过我会把你标记为答案,谢谢帮助
【解决方案2】:
$.each(images_array,function(value,i) {
  $('#thumb_'+ i).live('click', function(){
  $('#image_container_' + current_image_index).hide();
  current_image_index = i;
  alert(current_image_index);
  $('#image_container_' + current_image_index).show();
});}

正如其他人所说,您需要关闭。现在,您已经在使用 jQuery,所以忘记 for() 并直接使用 $.each。

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 2018-12-26
    • 2011-06-02
    • 2013-12-25
    相关资源
    最近更新 更多