JavaScript之闭包

本文详细介绍了JavaScript中的闭包概念,解释了如何利用闭包实现对外部函数变量的访问,同时也指出了闭包可能导致的内存泄露问题。此外,还介绍了立即执行函数及其在解决闭包问题中的应用。

闭包

不同作用域之间不能够相互访问,但是我们如果在一个函数内部在定义一个函数,并且这个内部函数与外部函数的变量有关联,那么就可以通过返回这个内部函数,然后来返回外部函数里面的变量,所以闭包其实就是函数内部和函数外部的一个联系。

        function a () {
            var demo1 = 123;
            add = function () {
                demo1 ++;
            }
            return function () {
                console.log(demo1);
            };
        }
        var demo = a();
        demo(); // 123
        add();
        demo(); // 124

当函数执行完之后,函数的执行上下文就会被销毁,就无法访问里面的变量,但这个函数返回了一个依赖这个函数的新函数,也就是说这个没有被销毁的新函数的作用域链中还存在着对原来函数的作用域的引用,就导致我们原本的函数的上下文不会被销毁,这样的话我们就可以在外部,继续使用这个被销毁的函数的变量了。

闭包会造成的问题

当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。

例:

    function a() {

        var num = 1;
        function add() {
            num++;
            console.log(num);
        }
        return add;
    }
    var demo = a();
    demo(); //2
    demo(); //3
    var demo1 = a();
    demo(); //2
    demo(); //3

立即执行函数

定义:此类函数没有声明,在一次执行过后即释放,常被用作初始化工作。

立即执行函数是解闭包的一个重要方法。

例:

        var arr = [1,2,3,4,5];
        var len = arr.length;
        for (var i = 0; i < len; i++) {
            window.setTimeout(function () {
                console.log(arr[n]);
            },2000);
        }

上述代码,运行结果并不是隔2秒后输出1,2,3,4,5,而是输出5个undefined,这就是闭包产生的问题,由于闭包问题的存在,当setTimeout函数执行的时候i已经是6了,但是arr[6]并没有值,就导致输出5个undefined。

通过立即执行函数就可以解决上述问题:

这里写图片描述

==主页传送门==

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值