个人理解
- 闭包 在函数内部return一个新函数,这个新函数就是闭包;
- 将一个全局变量放置在一个函数内,将其变成一个局部变量,这样做变量不会被函数外的程序执行操作;
- 这样做可以保护全局变量的安全;
- 防止全局变量污染;
- 想要在函数外调用这个变量,就需要通过闭包的语法形式来执行调用;
执行空间
- 定义好的函数以字符串形式储存在堆中,调用函数时 会将代码复制到函数执行空间,函数执行完毕之后,执行空间立即销毁;所以我们想要在函数外部调用函数内部的变量,需要让这个执行空间不被销毁;
- 让执行空间不被销毁需要满足两个条件:
- 函数返回值必须是引用数据类型
- 必须有一个变量接收函数的返回值结果,也就是将函数的返回值(引用数据类型的内存地址)存储
闭包原理
-
在closure函数内定义变量,并且closure函数的返回值是另一个函数
-
closure函数返回值的函数中 可以操作执行closure函数中 定义的变量
- tip: 因为闭包函数返回的是个引用数据类型,并且储存在了一个变量中,也就是时刻在占用闭包函数的执行结果,所以闭包函数的函数执行空间不会被销毁,只有函数执行空间不被销毁,才能在函数外部调用函数内部的变量
-
在closure函数外面有变量存储 closure函数的返回值,也就是存储返回的函数的内存地址
示例
// 定义函数closure
function closure(){
// 函数closure内定义的变量num
var num = 100;
// 返回值是一个函数
return function (){
// 返回的函数对num变量进行了操作
return num+=100;
}
}
// 函数closure之外有一个变量res存储函数closure的返回值(也是一个函数)的内存地址
const res = closure();
// 执行调用函数closure的返回值内函数,就是调用函数closure内的变量num
const result = res();
console.log(result);