为什么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
在传递给函数时的值。
好吧,简单地说...我想做这个(效果很好,但当我有#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
在传递给函数时的值。