为什么for循环没有让我的愿望成真?

时间:2015-10-16 13:34:04

标签: javascript loops global-variables var

好吧,简单......我想做到这一点(效果很好,但是当#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);
    });
}

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在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是一种“传递为价值”的语言。但是简单地说:

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

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