为什么for循环不能让我的愿望成真呢?

Why doesn't the for-loop make my wishes coming true?

本文关键字:我的愿望 for 循环 不能 为什么      更新时间:2023-09-26

好的,很简单…我想做这个(这工作完美,但显然是太多的文字当我把#b到#b20):

$("#b" + 1).click(function () {
    $('.c').hide();
    $(".a" + 1).show();
});
$("#b" + 2).click(function () {
    $('.c').hide();
    $(".a" + 1).show();
});

很简单,像这样:

for (var i = 0; i < 50; i += 1) {
    $("#b" + i).click(function () {
        $('.c').hide();
        $(".a" + i).show();
        alert('Hey'+i);
    });
}

$ (" # b + i) 按钮htmlpage,和 $("。a"+ i"是应该通过单击按钮在页面上查看的文本。//文本是类= " c a1 " , class = " c a2 " ,……;和按钮 id = " # b1 " , id = " # b2 " …但是当我执行代码时(点击#b1, #b2,或…),.c隐藏(如预期的那样),下一步只在I =50时执行(用警告证明)。

任何想法?

在for循环中试试:

for (var i = 0; i < 50; i += 1) {
    (function (j) {
        $("#b" + j).click(function () {
            $('.c').hide();
            $(".a" + j).show();
            alert('Hey'+j);
        });
    }(i))
}

实际上,这是一个经典,你应该读更多关于闭包的知识,以及JS是一种"作为值传递"的语言。简单地说:

作为参数发送给click函数的匿名function有一个对创建它的环境的引用,因此,有一个对i变量的引用,对于创建的每个function都是完全相同的(每次迭代创建一个函数)。因此,每个匿名函数的i都是循环的最后一个值。

通过使用另一个闭包,您使用JS将参数作为值传递而不是作为引用的事实:j(即使您称之为i,正如我之前所述)不是对i的引用,而是i在传递给函数时的值。