今天聊聊闭包, 网上五花八门的定义和解释很多很多, 是不是搞得你很懵逼; 每次看闭包, 都不同, 本来自己懂, 看完别人的之后就开始怀疑自己了在我看来, 闭包简单的说就是函数里面套函数, 再往大了说就是我函数外面想知道你函数里面的变量怎么知道? 我在你函数内部再写个函数 2, 把我想要得到的值获取到函数 2 中; 然后我在函数外面在获取函数 2 中的值, 完事, 函数 2 就成了闭包废话多了, 直接开讲
要理解闭包, 首先要知道 js 特殊变量和作用域
1 变量的作用域
变量的作用域有什么? 局部变量全局变量
js 的特殊之处就是函数内部可以获取全局变量,
- var a = 'shizhikai';
- function func(){console.log(a)
- }
- func() ;// 控制台打印 shizhikai
而外部是无法获取函数内的局部变量
- function func(){
- var a = 'shizhikai'
- }
- func();
- console.log(a) // 报错: a is not defined
这里注意一点是, 如果函数内部变量不用 var 声明, 那实际上就声明了个全局变量
- function func(){
- a = 'shizhikai';
- }
- func();
- console.log(a) ;
2 怎么获取 func 函数内部的局部变量?
就是我刚才上面说的, 在函数内部在套一个函数 2, 函数 2 获取 func 中的局部变量
- function func(){
- var a = 'shizhikai';
- function func2(){
- console.log(a)
- }
- return func2;
- }
- var b = func()
- b() ;
看到了, 我们外部获取到了函数内部的局部变量了
3 什么是闭包?
上面那个 func2 就是一个闭包
咳咳, 这下好好定义一下: 闭包就是能够读取其他函数内部变量的函数
4 闭包的应用
应用闭包的主要场合是: 设计私有的方法和变量
任何在函数中定义的变量, 都可以认为是私有变量, 因为不能在函数外部访问这些变量私有变量包括函数的参数局部变量和函数内定义的其他函数
匿名函数最大的用途是创建闭包, 并且还可以构建命名空间, 以减少全局变量的使用从而使用闭包模块化代码, 减少全局变量的污染
- var objEvent = objEvent || {};
- (function(){
- var addEvent = function(){
- };
- function removeEvent(){
- }
- objEvent.addEvent = addEvent;
- objEvent.removeEvent = removeEvent;
- })();
在这段代码中函数 addEvent 和 removeEvent 都是局部变量, 但我们可以通过全局变量 objEvent 使用它, 这就大大减少了全局变量的使用, 增强了网页的安全性
5 闭包的缺陷
闭包的缺点就是常驻内存会增大内存使用量, 并且使用不当很容易造成内存泄露
如果不是因为某些特殊任务而需要闭包, 在没有必要的情况下, 在其它函数中创建函数是不明智的, 因为闭包对脚本性能具有负面影响, 包括处理速度和内存消耗
来源: https://www.cnblogs.com/shizk/p/8503255.html