Javascript 为什么使用匿名函数的代码不起作用

Javascript 为什么使用匿名函数的代码不起作用,javascript,Javascript,我正在尝试使用匿名函数向锚对象添加处理程序 我运行了这段代码,但它不起作用。你能解释一下原因并尝试修复它吗?谢谢: var obj = document.getElementsByTagName("a"); var items = ["mouseover", "mouseout"]; for (var i = 0; i < items.length; i++) { (function() { var item = items[i]; for (var

我正在尝试使用匿名函数向锚对象添加处理程序

我运行了这段代码,但它不起作用。你能解释一下原因并尝试修复它吗?谢谢:

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);
            };      
        }
    })();               
}
var obj=document.getElementsByTagName(“a”);
var items=[“mouseover”、“mouseout”];
对于(变量i=0;i
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);
    };      
}
其次,
将更改,因此警报每次使用相同的值。为了避免这种情况,您可以使用匿名函数,但其中的要点是传递值,使其“冻结”:

var obj=document.getElementsByTagName(“a”);
var items=[“mouseover”、“mouseout”];
对于(变量i=0;i
原因是您在变量赋值之前使用了该变量:

var item = items[i];
变量
i
是在下一行声明的局部变量,而不是监视范围中的变量。变量具有函数作用域,因此即使变量在下一行声明,它也存在于整个函数中

如果希望能够从周围范围访问变量,则需要为函数中的变量使用不同的名称。出于历史原因,循环变量通常根据需要命名为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);
      };
    }
  })();               
}
var obj=document.getElementsByTagName(“a”);
var items=[“mouseover”、“mouseout”];
对于(变量i=0;i
你能把你期望的结果和不起作用的东西包括进去吗?为什么你还要使用匿名函数?在这种情况下,这毫无意义。只是删除它。它不起作用不是一个有用的问题描述。无论如何,有几个问题:嵌套循环使用相同的循环变量,在循环中创建闭包而不创建新的作用域。@pim字母表中还有其他字母,不是每个循环计数器都必须命名为
i
。这个函数仍然没有意义。我不会使用“onX”赋值,我会像这样使用事件注册-。或者更好的是,使用一个跨浏览器的框架来隐藏这个细节。@Felix Kling:如果你对内部循环使用
j
i
将具有正确的值,因为它没有被提升,所以你可以安全地捕获它。啊,是的。。。。然后您仍然需要“捕获”
项(
;)(否则,
警报
将为所有处理程序(至少是在每次外部循环迭代中创建的处理程序)输出相同的结果)。您又是对的。。。。对不起,所有这些循环让我困惑;)我可能只写
obj[j].onmouseover=obj[j].onmouseout=function(){…}
来避免内部循环。。。我想现在是时候休息一下了:)@Felix Kling:在这种情况下,它可能更直截了当,但我想在OP的场景中,
items
是动态的。但他还是解决了他的问题:)
var item = items[i];
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);
      };
    }
  })();               
}