一篇深入理解闭包

作者: 深度剖析JavaScript | 来源:发表于2020-08-04 20:48 被阅读0次
闭包是一个比较难理解的概念,翻看了一些视频教程,里面会说到:当内部函数被保存到外部,就一定生成闭包。至于什么是闭包也没说清楚。

于是在网上找了一些文章,发现网上大致有2种说法:

  1. 闭包必须返回嵌套函数中里面用到外面函数局部变量的函数才叫闭包,两个条件:
  • 嵌套函数中,内部函数用到外部函数的局部变量
  • 内部函数必须return出来
  1. 还有一些文章认为,只要函数嵌套,内部用到外部函数的局部变量,就是闭包,不一定必须要返回内部函数。

在看看《JavaScript高级程序设计(第四版)》第309页中对闭包的定义:

闭包指的是那些引用了另外一个函数作用域中的变量的函数

这里没有提到这个函数必须return出来,但是大部分时候都会return出来。
这下真相大白了,闭包也是一个函数,只不过这个函数比较特别,他有权限访问另外一个函数作用域中的变量,一般会被return到外部,导致原有的作用域链该释放的时候不释放。

闭包在实际项目中的应用,说白了就是一个函数需要频繁的操作一些变量,但是这些变量如果声明函数中,在函数每次执行时,都要重新声明、重新分配内存空间,一来麻烦,二来消耗内存,但是设置成全局变量又会污染全局变量,自然外面套一层函数的形式就出来了,这就是闭包。

外面套一层函数形成闭包带来新的两个问题:

  • 内部函数受到外层函数的限制,不够灵活了
  • 外层函数加上后,感觉又出现新的函数变量,我不想存储

那怎么办?

大家很快想到,形成闭包之后,内部原本的函数需要保证本来的灵活性,不受外层函数作用域的影响和限制,那就把内部函数return到外面。

而外层函数不想用变量存储,只想单独的运行1次,那就利用立即执行函数的方式来解决。

那么最终会看到我们现在比较常见的形式:

//例如:实现累加器
var temp = (function outer() {//outer名字可以省略
    var num = 0;
    function inner() {
        console.log(++num);
    }
    return inner;
}());
temp();
temp();
temp();

所以闭包解决一个很大的问题,它可以防止污染全局变量。

相关文章

网友评论

    本文标题:一篇深入理解闭包

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