闭包
利用执行空间不销毁
+ 函数的里面 返回一个引用数据类型
+ 在函数的外部 用一个变量去接收
+ 这样就可以让函数的执行空间不销毁
- 闭包函数
+ 有一个外层函数outer 有一个里层函数inner
+ 外层函数 返回里层函数,在外层函数外部 有变量去接收
+ 里层函数使用着外层函数的私有变量
闭包函数的应用
function outer(a){
// var a =50
var b = 100
return function inner(){
console.log(a)
console.log(b)
return a
}
}
let res = outer(50)
console.log(res)
let num = res()
console.log(num)
闭包的特点
+ 因为函数的执行空间不销毁 延长了变量的生命周期
+ 过多的使用闭包 造成内存的溢出
+ 在函数的外部 可以使用函数内部的变量
+ 必须保证外部变量的引用内部函数
+ 可以存储私有变量 避免变量的全局污染
+ 需要一直使用闭包去访问
应用场景
- 循环绑定事件
+ 沙箱模式
+ 防抖和节流
+ 单例模式
+ 函数的柯理化
+ vue data
…
闭包的相关面试题
<script>
function fun(n, o) {
console.log(o)
const obj = {
fun: function (m) {
return fun(m, n)
}
}
return obj
}
// var res = fun(0) //执行空间1 执行的是全局的fun var n = 0 var o console.log(o) //undefined
// // 执行空间1 存储对象空间 存储函数空间都不会销毁
// // console.log(res)
// res.fun(1) // 执行的是obj里面的fun函数(存储在执行空间1里面的) // 执行空间2 var m = 1 执行空间2 会销毁
// // 执行return 后面的fun 就是调用的是全局的fun函数 // 执行空间3 fun(1,0) var n = 1 o = 0 // 0
// res.fun(2) // 执行的是obj里面的fun函数(存储在执行空间1里面的) var m = 2
// // 执行return 后面的fun 就是调用的是全局的fun函数 fun(2,0) var n = 2 o = 0 // 0
// res.fun(3)
// var b = fun(0).fun(1).fun(2).fun(3)
// var b = fun(0) //执行空间1 执行的是全局的fun var n = 0 var o console.log(o) //undefined
// 执行空间1 存储对象空间 存储函数空间都不会销毁
// var b = fun(0).fun(1) // 返回一个obj 会有一个执行全局fun()执行空间3 var n = 1 o = 0 这个执行空间没有销毁
// var b = fun(0).fun(1).fun(2) // 返回一个obj 会有一个执行全局fun(2,1)执行空间4 var n = 2 o = 1 这个执行空间没有销毁
// var b = fun(0).fun(1).fun(2).fun(3) // fun(3,2) // 2
var c = fun(0).fun(1)
c.fun(2)
c.fun(3)
c.fun(100)
</script>