一、闭包:
闭包是函数程序的一种 高等级应用方法,目的是操作调用函数中的数据。
原因:为了保护数据的安全性,防止全局变量污染数据,将 变量,数据等定义在函数中,将数据,变量变成局部作用域变量,其他函数就不能直接操作改变这个变量。
二、执行空间
1、函数
(1)、函数的封装
a:在堆中开辟一个独立的存储空间, windows操作系统会给存储空间定义内存地址,准备存储函数程序
b:将函数程序以字符串形式 存储在 存储空间中
c:将内存地址 存储在 变量/函数名称中,变量/函数名称存储在栈中
(2)、函数的调用
a:从栈中 获取变量/函数名称 读取其中存储的内存地址,按照内存地址找到堆中的存储空间,读取存储空间中存储的函数程序
b:函数的形参赋值实参
c:预解析/预编译/预解释 函数中的程序代码
d:执行函数程序
i 函数程序的形参、变量、数据等存储在执行空间中。执行函数是在函数的存储空间中 再开辟一个独立的内存空间,存储这个函数的形参、变量、数据等,这个专门存储函数的空间,称为执行空间。
ii 在函数程序执行的过程中,执行空间是存在的,函数的所有数据 都存储在执行空间中
iii 函数执行结束,函数的执行空间被销毁/释放,执行空间中存储的数据也会被 销毁/释放,这个过程称为JavaScript程序 内存/数据的回收机制,目的是为了节约内容,提高程序的执行效率
2、生成不被销毁的执行空间
核心原理:在外界使用函数内部的数据,数据正在被使用,执行空间就不会被销毁
具体方法:用return返回 应用数据类型,在函数之外用变量存储函数的返回值
function fun1(){
return 100;
}
var res1=fun1();
//res1中存储的是基本数据类型数值100
//存储之后和函数就没有任何联系啦
function fun2(){
return [1,2,3,4,5];
}
var res2=fun2();
//res2中存储的是 函数fun2的返回值
//也就是数组的内存地址
//res2和函数的return值相互关联
//此时函数的执行空间不会被销毁
//函数的数据数值就会一直存在
三、闭包的基本语法形式
1、有一个函数A 存储 数据数值,这个数据数值就是被保护的全局变量数据
2、函数A的 返回值 是一个匿名函数,这个函数的作用就是操作 被保护的全局变量数据
3、在函数A外有一个变量存储函数A的执行结果返回值,也就是存储return的匿名函数
4、调用执行变量,就是在调用执行匿名函数,也就是在调用操作全局变量数据