【JavaScript】作用域和闭包

news2024/11/28 11:48:00

作用域

作用域是程序源代码中定义的范围。JavaScript采用词法作用域,也就是静态作用域。所谓词法作用域就是在函数定义的时候就已经确定了。

let value = 1
function foo(){
    console.log(value)
}
function bar(){
    let value = 2
    foo()
}
bar()  // 1

变量对象是当前代码段中,所有的变量(变量、函数、形参、arguments)组成的一个对象。变量对象分为全局变量对象和局部变量对象。全局简称为Variable Object VO,函数由于执行才被激活称为Active Object AO。

作用域链。在js中,函数存在一个隐式属性[[scopes]],这个属性用来保存当前函数的执行上下文环境,由于在数据结构上是链式的,因此也被称作是作用域链。我们可以把它理解为一个数组,可以理解为是一系列的AO对象所组成的一个链式结构。

作用域链的变量只能向上访问,直到访问到 window 对象终止。作用域链执行完会销毁。

function fn (){
}

console.dir(fn)

image.png

function fn (){
    console.dir(fn)
}
fn()

image.png

let global
function a() {
    let aa = 123
    function b() {
        let bb = 234
    }
    b()
}
a()
  1. 当 a 定义时,VO 包含 this(window), a(function), global
  2. a 调用时,加入 a 的 AO 包含 this(window), arguments, b(function)
  3. b 函数生成(a 函数的调用导致 b 函数的生成)
  4. b 函数调用,b 函数的 AO 包含 this(window), arguments, bb

闭包

之所以没有及时被垃圾回收机制回收,是因为作用域链没有断裂。

let global
function a() {
    let aa = 123
    function b() {
        console.log(aa)
    }
    return b
}
let res = a()
res()

闭包实际应用

回调函数,防抖节流,定时器传参,手写 js (bind…),封装某些方法。

一道笔试题

image.png

function add(n) {
    let sum = n;
    function innerAdd(nextNum) {
        if (nextNum !== undefined) {
            sum += nextNum;
            return innerAdd;
        } else {
            return sum;
        }
    }
    return innerAdd;
}

console.log(add(1)(2)()); // 3
console.log(add(1)(2)(3)(4)()); // 10
console.log(add(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)()); // 10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1577782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.基础乐理-唱名的来历,简谱的构造

前置内容:1.唱名与记住唱名的方法 唱名的来历: 很久很久以前(公元前)各个文明开始诞生和慢慢发展,随着文明的发展,各个文明都开始出现自己的音乐,根据考古学家的发现在 公元前1800年&#xff…

【随笔】Git 高级篇 -- 整理提交记录(下)rebase(十六)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

每日汇评:地缘冲突休战会阻碍黄金创纪录的涨势吗?

尽管以色列与哈马斯的地缘政治紧张局势有所缓和,金价仍冲破 2350 美元,创下新高; 对央行黄金购买量激增的预期抵消了美国非农就业数据主导的美联储强硬押注; 在美国CPI数据公布之前,由于 RSI 极度超买,金价…

YOLOV8注意力改进方法: CoTAttention(Visual Question Answering,VQA)附改进代码)

原论文地址:原论文下载地址 论文相关内容介绍: 论文摘要翻译: 具有自关注的Transformer导致了自然语言处理领域的革命,并且最近在许多计算机视觉任务中激发了具有竞争性结果的Transformer风格架构设计的出现。然而,大…

day02php环境和编译器—我耀学IT

一、环境介绍 1、web 环境 使用 PHP 需要先安装环境,安装环境比较麻烦,需要安装Web服务、PHP应用服务器、MySQL管理系统。 Web服务:apache 和 nginx PHP:多版本 MySQL:多版本 2、环境集成包 因为多环境、多版本、多系…

查看Linux系统相关信息

注: 本文只是博主学习记录分享,仅供参考。如有错误肯定是博主理解有问题,谢谢! 一、查看当前操作系统的内核信息 命令:uname -a 二、查看当前操作系统版本信息 命令:cat /proc/version 这条命令可以查看到…

什么是电子邮件加密?电子邮件加密有几种类型?

在当今数字时代,电子邮件已经成为人们日常生活中不可或缺的沟通工具,据相关数据统计,全球每天发送的电子邮件数以亿计,而这些邮件里面通常包含了姓名、地址、个人身份信息 (PII)、登录凭证、财务信息、法律合同、知识产权等有价值…

Python学习从0到1 day22 第二阶段 面向对象 ⑤ 多态

诋毁本身就是一种仰望 —— 24.4.8 学习目标 1.理解多态的概念 2.理解抽象类(接口的编程思想) 多态 多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态 多态常用在继承关系上 比如&am…

从事「音视频领域」开发工作有前途吗?

据我所知,做音视频的也分算法和工程,这两者都比普通开发高出不少,音视频工程开发的薪资大概比普通web开发高出30%。在开始前我有一些资料,是我根据网友给的问题精心整理了一份「音视频开发的资料从专业入门到高级教程」&#xff0…

使用 AI 生成正则表达式,告别正则烦恼

如果你有处理正则表达式的需求,那么这个网站(autoregex.xyz)一定要收藏好。 可以根据文字描述生成正则表达式。 默认是从文字到正则,不用选择。 输入框中输入描述,点击 ”GO“ 按钮。 等待一会儿,即可生…

计算 Hermitian 矩阵的特征值和特征向量 cusolver 示例 DnCheevj

1,原理 计算Hermitian 矩阵的特征值,使用Jacobi 旋转法,每次调整两个对称元素为0,通过迭代,使得非对角线上的值总体越来越趋近于0. 示例扩展了 nv 的 cusolverDsyevj 的示例 由于特征向量是正交的,故V*V…

预训练任务

预训练任务 - Mask Language Model jieba预分词长度小于4的词直接mask&#xff08;mask_ids就是input_ids&#xff09; if rands > self.mask_rate and len(word) < 4:word word_list[i]word_encode tokenizer.encode(word, add_special_tokensFalse)for token in wo…

Leetcode面试经典150_Q122买卖股票的最佳时机II

题目&#xff1a; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大…

快速为App打造Android端聊天室,节省80%开发成本(一)

前言 环信 ChatroomUIKit 提供 UIKit 的各种组件&#xff0c;能帮助开发者根据实际业务需求快速搭建聊天室应用&#xff0c;有效节约开发成本&#xff01;通过该 UIKit&#xff0c;聊天室中的用户可实时交互&#xff0c;发送普通弹幕消息、打赏消息和全局广播等功能。 本文详…

紫叶写作能用吗 #微信#知识分享

紫叶写作是一款非常好用、靠谱的论文写作工具&#xff0c;它旨在帮助用户快速高效地完成论文写作任务&#xff0c;并提供查重降重的功能。它不仅操作简单方便&#xff0c;而且功能强大&#xff0c;能够有效提高论文写作的效率和质量。 首先&#xff0c;紫叶写作提供了丰富的模板…

10款白嫖党必备的ai写作神器,你都知道吗? #媒体#人工智能#其他

从事自媒体运营光靠自己手动操作效率是非常低的&#xff0c;想要提高运营效率就必须要学会合理的使用一些辅助工具。下面小编就跟大家分享一些自媒体常用的辅助工具&#xff0c;觉得有用的朋友可以收藏分享。 1.飞鸟写作 这是一个微信公众号 面向专业写作领域的ai写作工具&am…

jmeter压测websocket协议

一、jmeter 安装websocket插件 1、选项--插件管理 2、搜索WebSocket Samplers by Peter Doornbosch插件 进行安装 3、 重启 jmeter 二、jmeter压测websocket协议实战 2.1、以网站为例&#xff1a; websocket在线测试 1、断开连接 2、打开F12&#xff0c;查看WS数据 3、…

基于Socket简单的UDP网络程序

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 网络编程前言 网络编程是连接数字世界的桥梁&#xff0c;它让计算机之间能够交流信息&#xff0c;为我们的生活和工作带来便利…

电路基础-电容-电感

电路基础 电容 通交流阻直流&#xff0c;滤波&#xff0c;旁路&#xff0c;退耦&#xff0c;作驱动电源&#xff08;洗衣机电机启动时需要一个强电启动&#xff09; 电容选型的工程值&#xff1b;参考以往开发板的选型&#xff1b;抄作业。 电源并连多个电容的作用 保证单…

thinkphp6使用阿里云SDK发送短信

使用composer安装sdk "alibabacloud/dysmsapi-20170525": "2.0.24"封装发送短信类 发送到的短信参数写在env文件里面的 #发送短信配置 [AliyunSms] AccessKeyId "" AccessKeySecret "" signName"" templateCode"&…