闭包定义:
闭包 一个函数和词法环境的引用捆绑在一起,这样的组合就是闭包(closure)。一般就是一个函数A,return其内部的函数B,被return出去的B函数能够在外部访问A函数内部的变量,这时候就形成了一个B函数的变量背包,A函数执行结束后这个变量背包也不会被销毁,并且这个变量背包在A函数外部只能通过B函数访问。
简单来说就是方法中返回方法:
<script>
let name = "prays"
function fn1(){
let name = "zll"
function fn2(){
let name = "prayszll"
console.log(name)
}
fn2()
}
fn1()
</script>
运行结果:
闭包存在的意义:
闭包解决的问题:
能够让函数作用域中的变量在函数执行结束之后不被销毁,同时也能在函数外部可以访问函数内部的局部变量。
延长变量的生命周期
如果不用闭包,方法执行一次,变量就没了,使用闭包,这个变量就会一直在内存中。闭包会常驻内存,要慎用。
创建私有环境
Vue data() 是一个函数,是为了保证每个组件都有私有作用域。
data(){
return {}
}
闭包是沟通内外部的桥梁:
function outer(){
let a = 'prays'
let b = 'zll'
return function inner(){
return a
}
}
function fn(){
let c = outer()
console.log(c)
}
fn()
运行结果:
闭包形成的原理:
作用域链,当前作用域可以访问上级作用域中的变量 。
作用域链就是当使用一个变量的时候,会先在当前作用域下寻找声明的变量,如果在当前作用域下找不到,会向上层作用域寻找,层层寻找,直到找到或找到全局作用域,形成链似结构。
闭包带来的问题:
由于垃圾回收器不会将闭包中变量销毁,于是就造成了内存泄露,内存泄露积累多了就容易导致内存溢出。
闭包的应用:
能够模仿块级作用域,能够实现柯里化,在构造函数中定义特权方法、Vue中数据响应式Observer中使用闭包等。