• JavaScript 闭包浅析


    词法作用域

    词法作用域是指一个变量在源码中声明的位置作为它的作用域。
    同时嵌套的函数可以访问到其外层作用域中声明的变量。

    函数中的定义的局部变量只能由函数的内部成员访问,而函数中的內部成员可以访问外部元素。

    例:

         function main() {
                // a 是 main 函数创建的局部变量
                var a = 'aaa'; 
                // b() 是函数内部方法,一个闭包
                function b() { 
                    alert(a); // 它使用了父函数声明的变量   
                }
                b();
            }
            main();
    

    main() 函数创建了本地变量 a 和函数 b()

    b()是定义在 main() 内部的内部函数,因此只能在 main() 函数内被访问。 b()没有内部变量,但是由于内部函数可以访问外部函数的变量, b()可以访问 main() 中的变量 a

    运行上述代码,我们可以看到 a 的值成功地打印出来。

    闭包

    概念

    比较官方的解释:

    一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

    第一次看见这个就是一脸懵逼,理解过后可以用一个例子解释一下。

    小明穿越了,去到了一个异世界,学习了一些个魔法,然后拯救了异世界,最后回到了地球世界。


    异世界的故事虽然结束了,但是小明还会魔法,回到地球后就nb坏了,成为了地球上的大明星。


    地球人现在也想学魔法,但是他们没法去异世界学,所以想学魔法只能通过小明。

    这里,异世界就是一个函数,里面有魔法、故事、怪兽、知识;

    异世界的魔法就是一个局部变量
    小明也是一个函数,它会魔法,有知识,经历了这些故事。这时候小明就是一个闭包了。

    作用

    • 作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
    • 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
    • 虽然相比较直接使用全局变量要复杂,但是更加安全稳定,同时避免污染全局变量环境。

    用法

    有两种思路

    • 声明一个全局变量,由函数内部元素调用 ( 不推荐,依旧污染全局变量 )
        var y;
        function a() {
            var x = "xxx";
            y = function(){
                return x;
            }
            return x;
        }
        a();
        alert(y());
    
    • 直接返回一个闭包由外界变量接收
        function a() {
            var x = "xxx";
            return function () {
                return x;
            }
        }
        var b = a();
        alert(b());
    

    待续

  • 相关阅读:
    十天冲刺之一
    每日日报2021 4/30
    每日日报2021 4/29
    每日日报2021 4/28
    每日日报2021 4/27
    每日日报2021 4/26
    每日日报2021 4/24
    每日日报2021 4/23
    《梦断代码》读后感
    273. Integer to English Words
  • 原文地址:https://www.cnblogs.com/aduner/p/12221763.html
Copyright © 2020-2023  润新知