【JS-task4】

闭包是什么?用处如何?

小课堂

分享人:钟楚炯

目录

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

闭包是JS语言的一个特色,也是一个难点,很多高级应用中都要依赖闭包实现。

一言蔽之,闭包就是:「函数」和「函数内部能访问到的变量」(也叫环境)的总和。

2.知识剖析

2.1 闭包到底是什么?

高程上的解释是:

闭包是指有权访问另一个函数作用域中的变量的函数.

我们把定语去掉可以得出,闭包实际上就是一个函数,但是还有一个特点,就是它可以访问另一个函数作用域中的变量。

所以闭包是由两部分组成:【函数】和【函数可以访问到的变量】

                    
                        function foo(){
                            var local = '变量';
                            function a(){
                                console.log(local);
                            }
                        }

                    
                

3.常见问题

闭包有什么作用?

4.解决方案

闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」。

举个粟子,当我们定义了一个变量,想要调用它,但又想隐藏起来不被别人无意修改到怎么做?

                    
                        function foo(){
                          var name = '狗蛋';
                          return function (){
                            return name;
                          }
                        }
                        var a = foo();
                        a();
                    
                

那问题来了,我们都知道在函数作用域链中,内部作用域可以访问外部的作用域,外部的作用域无法访问内部的作用域。

但在这个例子中,函数foo里声明的变量为什么可以在外部访问到呢?

当某个函数被调用时,会创建一个执行环境,及相应的作用域链。无论什么时候在函数中访问一个变量时,就会从作用域中搜索具有相应名字的变量。

一般来说,当函数执行完毕之后,局部活动对象就会被毁,内存中仅保存全局作用域,但是,闭包情况又有不同。

比如上述函数foo,在执行完毕之后,活动对象不会被销毁,因为匿名函数的作用域仍然在引用这个活动对象。要直到匿名函数被销毁后,函数foo的活动对象才会被销毁。

5.编码实战

6.拓展思考

闭包是否会造成内存泄露?

所谓的内存泄露是指你用不到(访问不到)的变量,依然占居着内存空间,不能被再次利用起来。 但闭包里面的变量就是我们需要的变量,所以说闭包不会造成内存泄露。 这个谣言是如何来的? 因为IE 有 bug,IE 在我们使用完闭包之后,依然回收不了闭包里面引用的变量。所以导致了内存泄露。 但这是是 IE 的问题,不是闭包的问题。

7.参考文献

js 闭包、常见认识误区与主要应用

8.更多讨论

感谢大家观看

BY : 钟楚炯