jQuery增量参数传递奇怪的行为

时间:2011-06-30 18:35:45

标签: javascript jquery

在我提出问题之前,让我先描述一下我的情景:

让计数器已经定义为从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。为什么会这样?

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'的当前值