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

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

好吧,简单地说...我想做这个(效果很好,但当我有#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) 是 html 页面上的按钮, $(".a" + i) 是通过单击按钮应该在页面上查看的文本。 //所以文本是带class="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是一门'pass as value'语言的事实。但简单地说:

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

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