我正在尝试使用匿名函数为锚点对象添加处理程序。
我运行此代码,但它无法解释原因,并尝试修复它?感谢:
var obj = document.getElementsByTagName("a");
var items = ["mouseover", "mouseout"];
for (var i = 0; i < items.length; i++) {
(function() {
var item = items[i];
for (var i = 0; i < obj.length; i++) {
obj[i]["on" + item] = function() {
alert("thanks for your " + item);
};
}
})();
}
答案 0 :(得分:7)
i
被“悬挂”;换句话说,您的函数正在执行:
var i;
var item; // vars are hoisted to the beginning
item = items[i];
for (i = 0; i < obj.length; i++) {
obj[i]["on" + item] = function() {
alert("thanks for your " + item);
};
}
i
中的items[i]
不是指外i
。相反,i
是undefined
。您应该使用单独的变量名称,例如内循环j
:
for (j = 0; j < obj.length; j++) {
其次,item
会发生变化,因此警报每次都会使用相同的值。为了避免这种情况,您可以使用匿名函数,但其中的要点是传递值以使其“冻结”:
var obj = document.getElementsByTagName("a");
var items = ["mouseover", "mouseout"];
for (var i = 0; i < items.length; i++) {
var item = items[i];
(function(item) {
for (var j = 0; j < obj.length; j++) {
obj[j]["on" + item] = function() {
alert("thanks for your " + item);
};
}
})(item);
}
答案 1 :(得分:5)
原因是您在为变量分配值之前使用变量:
var item = items[i];
变量i
是在下一行声明的局部变量,而不是来自surronding范围的变量。变量具有函数范围,因此尽管变量在下一行声明,但它存在于整个函数中。
如果您希望能够从周围范围访问变量,则需要在函数中为变量使用不同的名称。由于历史原因,循环变量通常根据需要命名为i,j,k。
var obj = document.getElementsByTagName("a");
var items = ["mouseover", "mouseout"];
for (var i = 0; i < items.length; i++) {
(function() {
var item = items[i];
for (var j = 0; j < obj.length; j++) {
obj[j]["on" + item] = function() {
alert("thanks for your " + item);
};
}
})();
}