当前位置: 首页 > article >正文

【JavaScript】从作用域角度理解闭包

作用域类型

在 JS 世界中,目前已经有了三种作用域:
全局作用域
函数作用域
块作用域
○ 由let或者const声明的变量,如果被一个大括号 {}这样括住了,那么这个大括号就是一个代码块,大括号括住的这些变量就形成了一个块作用域

一个简单的语句:

var a = 1;

在js引擎中执行上述语句分为两个阶段(一边编译一边运行):
var a ===》 编译时声明
a = 1 ===》 运行时赋值
在运行时js引擎会找当前作用域下是否有a的声明,没有的话就会往上级作用域查找,一直到最外层全局作用域还没有的话会抛出异常。

作用域链

当一个块或者一个函数嵌套在另一个块或者函数中时,就发生了作用域的嵌套。比如这样:

function addA(a) {
  console.log(a + b)
  console.log(c) // 报错
}

var b = 1

addA(2) //3

在这个例子中,有两个作用域:addA 的函数作用域和全局作用域。它们的关系示意如下:

在这个查找过程中,层层递进的作用域,就形成了一条作用域链

闭包

函数使用了既不是函数参数也不是当前作用域的变量就构成了闭包。

const test = (()=> {
  let a = 1;
  return () => {
    return a++;
  }
})()

 console.log(test(), test())// 1 2

如上面例子,当test函数内使用a变量时发现对应函数作用域下并没有,然后沿作用域链往上找,找到对应函数作用域外有然后使用,此时便构成了闭包。


http://www.kler.cn/news/293413.html

相关文章:

  • 【AIGC半月报】AIGC大模型启元:2024.09(上)
  • 实际开发中git在IDEA中的使用
  • 机器学习之实战篇——MNIST手写数字0~9识别(全连接神经网络模型)
  • UDP通信实现
  • windows下安装elasticSearch和kibana
  • 报错:CPU指令集的问题
  • Nest.js 实战 (十一):配置热重载 HMR 给服务提提速
  • 鸿蒙界面开发——组件(6):属性字符串(StyledString)文本输入
  • Linux_kernel移植uboot07
  • 单例模式singleton
  • C#基础(2)枚举
  • 工作流之Activiti7 和BPMN讲解
  • Elastic Stack--ES集群加密及Kibana的RBAC实战
  • 报错:Reached the max session limit(DM8 达梦数据库)
  • 【C语言】---- 复合数据类型之结构体(Struct)
  • 期权虚值和实值的投资风险有什么不同?
  • docker 安装mongoDB
  • Anchor Alignment Metric来优化目标检测的标签分配和损失函数。
  • Apache CloudStack Official Document 翻译节选(十三)
  • 使用多尺度C-LSTM进行单变量时间序列异常检测
  • 细胞因子系列
  • 92. UE5 GAS RPG 使用C++创建GE实现灼烧的负面效果
  • 嵌入式学习(链式栈和链式队列)
  • yolov8目标检测pyside6可视化图形界面+检测源码ui文件——用于计数统计
  • Docker基本使用:创建clickhouse容器
  • OKRs-E 目标管理上手指南
  • 电脑错误mfc140.dll丢失怎么办?mfc140.dll丢失如何修复?
  • 使用docker调试odoo
  • 并行编程实战——TBB的安装
  • Go语言实战 pdf