【发布时间】:2011-11-23 17:54:26
【问题描述】:
我正在尝试将存储在数组中的一系列对象分配给 jquery click 事件处理程序。
问题是,当事件触发时,我只引用数组中的最后一个对象。
我整理了一个简单的例子来说明问题:
function dothis() {
this.btns = new Array('#button1', '#button2');
}
// Add click handler to each button in array:
dothis.prototype.ClickEvents = function () {
//get each item in array:
for (var i in this.btns) {
var btn = this.btns[i];
console.debug('Adding click handler to button: ' + btn);
$(btn).click(function () {
alert('You clicked : ' + btn);
return false;
});
}
}
var doit = new dothis();
doit.ClickEvents();
HTML 表单包含几个按钮:
<input type="submit" name="button1" value="Button1" id="button1" />
<input type="submit" name="button2" value="Button2" id="button2" />
当button1被点击时,它会说“你点击了#Button2”
似乎两个按钮单击处理程序都指向 var btn 中的同一个对象。
考虑到变量在for循环内,我不明白为什么。
有什么想法吗?
【问题讨论】:
-
JavaScript 只有函数作用域,没有块作用域。仅仅因为看起来该变量在您的循环中,它确实绑定到函数的范围。因此,当您的处理程序被调用时,
btn将指向循环结束时它指向的任何内容。匿名函数使ClickEvents函数的作用域保持活动状态。一旦你理解了这一点,如何解决它应该是很明显的。 -
StackOverflow 上也有大量与此相关的问题/答案。在开始使用 JS 进行函数式编程时,它可能是最先让人们绊倒的事情之一。
标签: javascript jquery arrays object scope