闭包形成条件:至少是二个函数,并且是嵌套关系,内部函数还需要访问外部函数的局部变量。
作用:1,私有变量,保护数据安全。
2,持久化维持数据。
function fn() {
var num = 10;
inner(n) {
num = n
}
//inner函数可以改变num的值,所以把inner这个函数的功能返回出去
return inner
}
//ret 接收到了fn的返回值inner
var ret = fn()
//此时调用ret就是调用了inner,可以改变num的值
ret(100)
-------------------------------------------------------------------------------------------------------------------------------
闭包基本模型
function out() {
var num = 20
return function () {
num++
console.log(num)
}
}
----------------------------------------------------------------------------------------------------------------------------------
function out () {
var cache = {}
function fib (n) {
//第一个月和第二个月兔子的数量都是一对
if(n ===1 || n ===2) {
return 1
}
if(cache[n]) {
return cache[n]
}else {
//1,计算兔子数量
var ret = fil(n-1) + fib(n-2)
//2,用容器把变量存起来
cache[n] = ret
//3,把计算结果返回出去
return ret;
}
return fil(n-1) + fib(n-2)
}
//把fib函数作为out函数的返回值
return fib
}
//ret接收fib函数的返回值
var ret = out()
//此时调用ret就是调用了fib
//这个案例用到了递归,缓存,闭包
全局作用域占用内存,页面关闭或浏览器退出就会释放内存。
函数作用域占用内存,函数调用结束就释放内存。
----------------------------------------------------------------------------------------------------------------------------------
存取钱案例(闭包)