今天心情还可以,回顾一下JS的闭包知识。掌握闭包,我个人觉得弄清楚以下几个问题就差不多了:
- 什么是闭包?
- 什么是JS闭包?
- JS闭包的适用场景有哪些?
- 有什么缺陷?
闭包的概念
从字面意思来理解就是封闭和包裹,换句话说,就是在函数内部定义的变量,在函数的外部无法访问到,因此就说函数构成了一个闭包。说白了闭包是作用域的应用。
计算机科学中对闭包的定义为:一个函数的函数体以及函数所处的环境,构成的一个综合体叫做闭包,函数体就是函数内部的代码,函数所处的环境指的就是作用域。
JS闭包
引用MDN上的解释:闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。
听起来云里雾里吧,网上找了好多资料,每个人对闭包的定义也不一样,搞得我也不知道怎么去定义闭包了,所以干脆不去定义了,意会吧。
我觉得创建闭包最常见方式,就是在一个函数内部创建另一个函数。下面例子中的 closure 就是一个闭包:
function func(){
var a = 1,b = 2;
function closure(){
return a+b;
}
return closure;
}
闭包的作用域链包含着它自己的作用域,以及包含它的函数的作用域和全局作用域。
JS闭包的适用场景
以下3点是闭包最基本的应用场景,很多经典案例都源于此:
- 1.保护函数内的变量安全
- 2.在内存中维持一个变量
- 3.通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)
实际场景:
- 场景一:采用函数引用方式的setTimeout调用
- 场景二:将函数关联到对象的实例方法
- 场景三:封装相关的功能集
【引自:https://blog.csdn.net/yanghua_kobe/article/details/6780181】
闭包带来的缺陷!
技术跟人一样,总有长处和短处,在做到扬长避短之前,就要做到知己知彼,百战不殆!
- 闭包的缺点就是常驻内存会增大内存使用量,并且使用不当很容易造成内存泄露。
- 如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。
网友评论