闭包以及了解函数的执行过程

闭包

本质作用

可以 操作 函数内部 定义的变量数据

为了防止全局变量污染 将全局变量定义 在 函数中 变成 私有变量

其他程序就 不能直接操作这个变量

再通过闭包的语法来调用操作这个数据

为了防止全局变量污染 将 变量定义在 函数中

再 通过闭包的语法 操作使用这个变量

深入了解函数 的执行原理

封装

1, 在 堆 中 创建一个 存储空间

扫描二维码关注公众号,回复: 14752550 查看本文章

操作系统给存储空间赋值内存地址

准备存储 函数程序

2, 将 函数程序 以 字符串形式 存储到 存储空间中

3, 将 变量/函数名称 存储 在 栈 中

变量/函数名称 中 存储的是 函数的内存地址

调用

1, 从 栈 中 存储的 变量/函数名称中 解析 内存地址

按照 内存地址 找到对应的 存储空间

读取调用 存储空间中 存储的函数程序

2, 给 函数的形参赋值实参

3, 预解析 函数程序

4, 执行 函数程序

深入了解 函数的执行过程

在 函数的存储空间中 再开辟一个独立的 存储空间

专门存储 函数中 定义的 变量和形参

函数中 定义的 变量/形参 在 函数执行时

存储在 堆 中 函数的 存储空间中

不会 存储到 栈 中

函数执行结束 函数中存储数据的 存储空间就会被 销毁/释放

存储空间中存储的 函数的 变量/形参 也会被 销毁/释放

也就是 函数执行结束 函数中 定义的变量/形参 就不会再存在了

专门存储函数 变量/形参 的 存储空间 称为 执行空间

函数执行时 生成 执行空间 存储 函数中的 变量/形参

函数执行结束 销毁/释放 执行空间 执行空间中 存储的 函数的变量/形参 也会被 销毁/释放

这样的 执行机制 / 执行原理 称为 函数执行时 JavaScript函数的内存回收机制

作用是 为了 销毁/释放 内存中的无效数据 减少 内存空间的占用 提高程序的执行效率

函数执行之前

函数程序 是 以 字符串形式存储

函数程序 没有执行 变量没有定义 变量不存在

函数执行之后

函数的执行空间被销毁

执行空间中 存储的 函数的变量/形参 也会被销毁

始终调用不到函数的原因,是因为,还没执行时,函数是以字符串的形式存储数据,所以调用不到,函数执行完成是瞬间的,执行完就删除了

所以在函数里面可以调用 函数外调用不到

生成一个不被销毁的执行空间

函数执行时 生成 执行空间 存储 函数的变量/形参

函数执行结束 执行空间 被销毁 函数的变量/形参 也会被销毁

如果 要 调用使用 函数中的数据

就需要执行空间 不会被 销毁

生成一个不会被销毁的执行空间的原理

执行空间中存储的数据 正在被使用应用

如果 销毁执行空间 js程序执行就会报错出问题

如果 函数的返回值 return 的是 引用数据类型

函数 return 的是 应用数据类型的 内存地址

函数外变量 存储的是 函数的执行结果 返回值

也就是 函数外变量 存储的是 return的 引用数据类型的内存地址

如果 函数执行结束 销毁执行空间 也就是 销毁了 引用数据类型

函数外变量 存储的内存地址 就 没有 对应的存储空间了

js程序执行就会报错

函数的执行结果 返回值 return 是 引用数据类型

执行空间 不会被 销毁

四. 闭包的基本语法

闭包的基本语法形式

有一个函数A

其中 定义存储了 变量/形参

函数A的返回值 是 一个 匿名函数

在 函数外 有 变量 存储函数A的执行结果返回值

变量储存的是 函数A的返回值 也就是 匿名函数

调用 变量() 也就是 调用 匿名函数

匿名函数的程序是 操作 函数A中 定义的变量/形参

变量() 调用 操作的就是 函数A中定义的 变量/形参

是console.log 输出的结果

猜你喜欢

转载自blog.csdn.net/weixin_69419680/article/details/125940553