什么是闭包?
当函数被保存到外部时,就会产生闭包(或者说是当函数执行完毕后,函数的执行期上下文尚未被销毁且保存到了函数外部)
闭包的缺点:
由于闭包不会在函数执行完毕后释放对应的作用域,所以会导致内存泄漏
闭包的作用:
1.可以当作缓存【就是说在函数内部定义了一个变量,这个变量在函数内部是不能直接访问的,只有通过闭包来访问,于是这个变量就相当于被存储起来了,等到要修改或是访问它的时候就可以通过闭包来访问了】
2. 可以实现封装,属性的私有化
3. 模块化开发,防止污染全局变量
闭包的特性:
1.封闭性:外界无法访问闭包内部的数据。如果在闭包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口;
2.持久性:一般的函数,调用完毕之后,系统自动注销函数,而对于闭包来说,在外部函数被调用之后,闭包结构依然保存在系统中,闭包中的数据依然存在,从而实现对数据的持久使用。
下面来看一个简单的例子:
代码如下:
<script>
function f(){
var a = 200;
function g(){
return a;
}
return g;
}
console.log(f()()) // 200
</script>
以上代码块中,函数g()就被包在函数f()内部,这是f()内部所有的局部变量对g()都是可见的,但是反之就不可以了。
这就是JavaScript特有的“链式作用域”结构,子对象一级一级的向上寻找所有的父元素对象的变量,所以父元素所有的变量对子元素对象都是可见的,反之不行。
如果我们要在f()外部读取内部的变量a,是无法直接读取的,但是g()可以读取f()里的a,这样我们就可以把g()作为返回值,然后就可以在f()外部读取里面的变量了。