试验为什么不能形成闭包的形式,问题1此处的传参i为什么不能被传入,问题二这样写这个aaa函数是叠加的吗,还是被后面的aaa覆盖了

window.onload=function(){
    var arrLi=document.getElementsByTagName("li")
    console.log(arrLi,"arrLi");
        for(var i=0;i<3;i++){
            console.log(i,"i");
            
            
            function aaa(i){----->问题1此处的传参i为什么不能被传入,问题二这样写这个aaa函数是叠加的吗,还是被后面的aaa覆盖了
            
            
                console.log(i,"aaa里面的i")
            arrLi[i].onclick=function(){
                alert(i)
            }
        }
            console.log(aaa);
    }
    
}
阅读 2k
2 个回答

你这样写,有很多问题啊。你在for循环里定义了函数aaa,并没有调用函数aaa,所以,i根本没有传入到aaa中。
并且你在for循环里创建函数,每轮for循环结束,该函数就无法被调用了,这里的aaa,每次产生的都是新的函数

var a = {};
console.log(D);        // undefined
for(var i=0;i<2;i++){
    function D(){
        console.log('0');
    }
    a[i] = D;
}
console.log(a[0]==a[1]);  // false

在for循环里声明的函数,每次产生都是不同的函数,我在上面,将D放入一个obj中,for循环后比较,返回false证明了这点

你的代码,与下面的代码,是等价的

window.onload=function(){
    var aaa;                 // 修改的地方
    console.log(aaa);        //undefined
    var arrLi=document.getElementsByTagName("li");
    console.log(arrLi,"arrLi");
        for(var i=0;i<3;i++){
            console.log(i,"i");
            aaa = function(i){    // 修改的地方
                console.log(i,"aaa里面的i")
                arrLi[i].onclick=function(){
                alert(i)
            }
        }
            console.log(aaa);
    }
}

你在for循环里,使用function aaa(){}创建函数,其实,这里的变量aaa会被变量提升到顶部,
然后在for循环里对这个aaa赋值.所以,这里是被覆盖了

你在for循环中,不能定义声明式函数语句;会导致许多问题。每次for循环,该函数不会被调用了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题