在我提出问题之前,让我先描述一下我的情景:
让计数器已经定义为从0开始的数字。
我有2个标签:让它们成为a1和a2
我首先动态地将a1添加到我的html中,然后使用它:
jQuery("a.adder").click(function(){adder(this, counter)});
然后我做了counter++
然后我动态地将a2添加到我的html中,然后再次使用 我的标签
jQuery("a.adder").click(function(){adder(this, counter)});
然后我做了counter++
另外,在我的adder(param1, param2)
中,我所做的只是alert(counter)
好的,这是我的问题:完成所有操作后,当我点击具有2个处理程序的a1时,警报输出为2(每个处理程序警报两次),对于a2,单击时警报也为2。为什么会这样?
答案 0 :(得分:1)
它为两者返回2的原因是你的匿名函数正在对计数器变量创建一个闭包。这意味着这些方法在绑定它们时不仅具有计数器的当前值,它们对变量具有引用。
稍后该变量的任何更改都将反映在捕获的变量中。
您可以通过为第二个绑定创建新变量来阻止这种情况:
var counter = 0;
function adder(e, counter) {
alert(counter);
}
jQuery("<a class='adder'>a1</a><br />')").appendTo("body");
jQuery("a.adder").click(function(){adder(this, counter)});
counter++;
var newCounter = counter;
jQuery("<a class='adder'>a2</a>')").appendTo("body");
jQuery("a.adder").click(function(){adder(this, c)});
counter++;
这里创建了一个名为newCounter的新计数器变量,它由第二个事件处理程序捕获。
答案 1 :(得分:0)
您制作了两个点击事件,您的点击事件会返回'counter'的当前值