用IIFE解决一道闭包经典面试题

看到一个面试题,题目是这样的:

function test(){
            var arr = [];
            for(var i =0;i<10;i++){
                  arr[i] = function(){
                    document.write(i + " ")
                  }     
            }
            return arr
        }
        var myArr = test()
        for(var j =0;j<10;j++){
            myArr[j]()
        }

问输出的结果是多少: 结果 10个10
分析一下这段程序,return arr,arr每一项赋值了函数,然后抛出,形成闭包,然后再二次循环这个数组,循环10,myArr其实就是arr,所以也就是循环这个arr的每一项,所以变成了循环arr的每一个函数然后执行,那么现在就是要分析这个arr每一项是什么东西.
再来看, i 循环里面,当i = 0时,输出0,i=1时,输出1,是不是,那么我arr数组的每一项就是一个从0-9的数组,是不是? 假如我们这样想的话, 就进入了这个题的陷阱了. 这道题它其实是类似于一个重复声明的过程(我理解的),因为函数没有执行,所以每一项就都会重复赋值,意思就是 i=0时,赋值一个函数表达式,i=1时,赋值一个函数表达式,最后到i=10不符合,但是输出打印的是i,所以最后函数表达式就是打印10,或者可以这样理解,函数是一段功能,在这里就是打印i,所以最后结果赋了值.
那么再问一个问题,假如我想输出0-9呢,在这个基础上应该怎么进行修改呢?

function test(){
            var arr = [];
            for(var i =0;i<10;i++){
               (  function(j){
                  arr[j] = function(){
                    document.write(j + " ")
                  }  
                }(i))
            }
            return arr
        }
        var myArr = test()

        for(var j =0;j<10;j++){
            myArr[j]()
        }

这样,用立即执行函数包裹住里面那部分,每次循环就立即执行,就可以得到正确的结果了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值