当前位置: 首页 > 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/a/293413.html

相关文章:

  • ubuntu-desktop-24.04上手指南(更新阿里源、安装ssh、安装chrome、设置固定IP、安装搜狗输入法)
  • INQUIRE:一个包含五百万张自然世界图像,涵盖10,000个不同物种的专为专家级文本到图像检索任务设计的新型基准数据集。
  • 【云计算解决方案面试整理】1-2云计算基础概念及云计算技术原理
  • 俏美韵从心出发,与女性一道为健康生活贡献力量
  • C++单例模式实现
  • 【金融风控】特征评估与筛选详解
  • 【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进行单变量时间序列异常检测