函数的两个阶段
- 定义阶段
- 调用阶段
- 注意点:
=>只要函数执行完毕了,那么执行空间就销毁了
=>只要函数内部向外部返回一个引用数据类型,并且在函数外部有变量接收的情况下,那么执行空间不会销毁(闭包就是引用了这一概念)
调用栈
- 函数调用的时候都会在调用栈里面执行
- 函数调用一次,都会在调用栈里面开辟一个函数执行空间
- 函数的执行空间调用完毕后,都会自动销毁
- 怎么让函数执行空间不销毁呢?
- 给外界返回一个引用数据类型
- 外界有变量接收
闭包
- 概念:
=>闭包就是能够读取其他函数内部变量的函数 - 作用:
=>可以在函数外部访问函数内部的数据,延长了变量的声明周期,保护私有变量,不会污染全局。
不被销毁的执行空间
闭包的特点
- 作用域空间不销毁
- 优点:因为不销毁,变量不会销毁,延长变量的生命周期
- 缺点:因为不销毁,会一直占内存,多了以后就会导致内存溢出
- 可以利用闭包访问在一个函数外部访问函数内部的变量
- 优点:可以在函数外部访问内部数据
- 缺点:必须时刻保持引用,导致函数执行栈不被销毁
- 保护私有变量
- 优点:可以把一些变量放在函数里面,不会污染全局
- 缺点:要利用闭包函数才能访问,不是很方便
闭包概念
- 有一个A函数,在A函数内部返回一个B函数
- 在A函数外部有变量接收
- B函数内部访问着A函数内部的私有变量
- 以上三个条件缺一不可
function fn(){
// 私有变量
let num = 10
// 要给外界返回一个函数,并且在这个返回的函数内部要引用私有变量
return function(){
console.log(num)
}
}
// 外界使用变量接收返回的函数
let res = fn()
res()