函数的闭包

作者: 马大哈tt | 来源:发表于2017-10-10 21:43 被阅读0次

函数的闭包是个老生常谈的话题,但说起闭包,还是很难透彻的理解它的含义,在很多应用中都要使用闭包实现,要想搞明白函数闭包是什么,首先必须得明白变量的作用域。

变量的作用域

变量分为:全局变量和局部变量
1.局部变量:在函数内部声明的,不可以在函数外部使用。(本质原因:函数再被调用的时候会入栈,并且分配空间,函数内部的变量,都是在这块空间内部声明的,当函数运行完毕之后就会出栈,系统回收空间,函数内部的变量所占空间也会被回收,所以不能在函数外面使用函数内部定义的变量)
2.全局变量:在函数以外声明的。
eg1. 数组里面的两个a是同一个a。对象引用

         var a = {name:"张三", age:18};
         var arr = [];
         arr.push(a);
         arr.push(a);
         // a发生变化之后,数组内部也会改变、。
        a.name = "李四";
        console.log(arr[0] == arr[1]);
结果1.png

eg2.函数t运行两次,就会有2个a。这两个a不是同一个a

        var arr = [];
        function t(){
            var a = {name:"张三", age:18};
            arr.push(a);
        }
        t();
        t();
        arr[0].name = "李四";
        console.log(arr);
        console.log(arr[0] == arr[1]);
结果2.png

eg3.执行同一次函数的时候,变量是相同的

        var arr = [];
        function t(){
            var a = {name:"张三", age:18};
            arr.push(a);
            arr.push(a);
        }
        t();
        arr[0].name = "李四";
        console.log(arr);
        console.log(arr[0] == arr[1]);
结果3.png

上面三个例子充分解释了变量作用域的区别。

函数的闭包

闭包简单来说就是函数内部的函数,闭包里面使用局部变量和函数参数的时候,用的就是外部函数的局部变量。

1.同一个函数调用两次,会返回两个函数f1,和f2。 f1和f2里面的a分别是第一次和第二次调用fn的时候生成的a。所以是两个不同的a

        function fn(){
            var a = 10; // 局部变量
            return function(){
                console.log(++a);
            }
        }
        var f1 = fn(10);
        var f2 = fn(10);
        f1();
        f1();
        f1();
        f1();
        f1();
        f2();
结果4.png

2.调用一次函数返回两个函数f1,和f2。f1和f2里面的a都是第一次调用fn的时候生成的,所以是同一个a

function fn(){
            var a = 10; // 局部变量
            function in1(){
                console.log(++a);
            }
            function in2(){
                console.log(++a);
            }
            return [in1, in2];
        }
        var arr = fn();
        var f1 = arr[0];
        var f2 = arr[1];
        f1();
        f1();
        f1();
        f1();
        f1();
        f2();
结果5.png

闭包虽然用处很大,但它的弊端也不容忽视。闭包会导致函数运行结束之后局部变量的空间不会被释放从而造成内存泄露(执行的次数越多,占用的内存越多),所以一些经常需要重复执行的代码不适合使用闭包。

相关文章

  • 如何理解闭包?

    1、定义: 嵌套在函数作用域中的函数,称为闭包函数。该作用域称为闭包环境。通过闭包函数可以访问闭包函数所在函数作用...

  • 关于逃逸闭包

    逃逸闭包:当函数执行结束后,才去调用函数内部的闭包,叫做逃逸闭包非逃逸闭包当函数执行过程中,执行的函数内部的闭包,...

  • 3.逃逸闭包,非逃逸闭包

    逃逸闭包:当函数执行结束后,才去调用函数内部的闭包,叫做逃逸闭包非逃逸闭包:当函数执行过程中,执行的函数内部的闭包...

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • JS的闭包

    1.闭包的概念 闭包函数:声明在一个函数中的函数,叫做闭包函数。闭包:内部函数总是可以访问其所在的外部函数中声明的...

  • 面试题(day-2)

    1 ,什么是闭包?闭包有什么好处?使用闭包要注意什么? 闭包:函数嵌套函数,内部函数可以引用外部函数的参数和变量,...

  • python函数之闭包

    目录 python函数之闭包什么是闭包python中的namespace闭包的条件闭包的优点 python函数之闭...

  • 闭包和立即执行函数

    闭包闭包:内部的函数引用了外部的函数的变量,则产生闭包。闭包的作用:把变量封装在函数中,只有内部函数可以用,让函数...

  • day14-函数(3)装饰器

    一、闭包函数 闭包函数=函数嵌套定义+函数对象+名称空间与作用域 闭包函数 1、闭:指的是该函数是定义在一个函数内...

  • 闭包函数

    闭包函数 闭包,又称闭包函数或者闭合函数,其实和嵌套函数类似,不同之处在于,闭包中外部函数返回的不是一个具体的值,...

网友评论

    本文标题:函数的闭包

    本文链接:https://www.haomeiwen.com/subject/ifbbyxtx.html