什么是闭包?

<body>
    <!-- 一个函数里面嵌套一个函数就是闭包,里面的函数可以访问外层函数的变量 -->
    <script>
        function out() {
            let arr = [1, 2, 3];

            return function read() {
                return arr;
            }
            read();
        }
        const res = out();
        console.log(res()[1]); //4
        // 通过闭包在window下面可以使用数组arr

        // 优点:避免造成全局污染
        // 缺点:变量不会被垃圾回收机制回收,增加了内存的消耗

        for (var i = 0; i < 5; i++) {
            setTimeout(() => {
                console.log(i);
            })
        }
        console.log(i); //5
        // 很明显,输出5个5;同步创建5个定时器,之后执行异步函数。此时的i为5

        // ES6中新增的let可以改变结果,但是无法从for循环外面访问变量
        // for (let j = 0; j < 5; j++) {
        //     setTimeout(() => {
        //         console.log(j); //0,1,2,3,4
        //     })
        // }
        // console.log(j); //j is not undefined

        for (var m = 0; m < 5; m++) {
            setTimeout((() => {
                console.log(m); //0,1,2,3,4
            })())
        }
        console.log(m); //j is not undefined
        // setTimeout里面的回调函数写成立即执行函数,调用的是外面的作用域,从而形成了闭包。
        // 待主线程结束时,执行异步。输出对应的m值,而不是m的最后结果。
    </script>
</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值