闭包:是指有权访问另一个函数作用域中变量的函数。
创建闭包的最常见的方式:
就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量。
闭包有两个常用的用途:
- 使我们在函数外部能够访问到函数内部的变量。
通过使用闭包,可以通过在外部调用闭包函数,从而在外部访问到函数内部的变量,可以使用这种办法来创建私有变量。
- 使已经运行结束的函数上下文中的变量对象继续留在内存中。
因为闭包函数保留了这个变量对象的引用,所以这个变量对象不会被回收。
比如,函数 A 内部有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包。
function A() {
let a = 1
window.B = function () {
console.log(a)
}
}
A()
B() // 1
在 JS 中,闭包存在的意义就是让我们可以间接访问函数内部的变量。经典面试题:循环中使用闭包解决 var 定义函数的问题
for (var i = 1; i <= 5; i++) {
setTimeout(function timer() {
console.log(i)
}, i * 1000)
}

首先因为 setTimeout 是个异步函数,所以会先把循环全部执行完毕,这时候 i 就是 6 了,所以会输出一堆 6。解决办法有三种:

第一种是使用闭包的方式:
for (var i = 1; i <= 5; i++) {
;(function(j) {
setTimeout(function timer() {
console.log(j)
}, j * 1000)
})(i)
}

在上述代码中,首先使用了立即执行函数将 i 传入函数内部,这个时候值就被固定在了参数 j 上面不会改变,当下次执行 timer 这个闭包的时候,就可以使用外部函数的变量 j,从而达到目的。

第二种就是使用 setTimeout 的第三个参数,这个参数会被当成 timer 函数的参数传入:
for (var i = 1; i <= 5; i++) {
setTimeout(
function timer(j) {
console.log(j)
},
i * 1000,
i
)
}
第三种就是使用 let 定义 i :
for (let i = 1; i <= 5; i++) {
setTimeout(function timer() {
console.log(i)
}, i * 1000)
}

JavaScript 对闭包的理解?的更多相关文章

  1. 对JavaScript中闭包的理解

    在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容.之前我对闭包的理解主要是"通过闭包可以在函数外部能访问到函数内部的变量",对闭包运用的也很少,甚至自己写过闭包自己 ...

  2. 转:对JavaScript中闭包的理解

    关于 const     let      var  总结: 建议使用 let  ,而不使用var,如果要声明常量,则用const. ES6(ES2015)出现之前,JavaScript中声明变量只有 ...

  3. 关于javascript中闭包的理解

    闭包就是能够读取其他函数内部变量的函数. 在javascript中,只有函数内部的子函数可以读取局部变量,因此,我理解闭包就是定义在一个函数内部的函数. 例子: var f1 = function() ...

  4. javascript之闭包深入理解(一)

    曾经在开始学习javascript的时候,很是不理解闭包的概念.今天想对它详细的剖析. 在说清楚闭包之前,必须先清楚作用域链. 作用域链 我们知道,执行环境是js中最为重要的一个概念.执行环境定义了变 ...

  5. javascript之闭包深入理解(二)

    在上一节中,详细理解了作用域链和垃圾回收机制,似乎这两点跟闭包关系不大,但是仔细想一想就会发现,其实不然.这一节将通过上一部分的说明详细理解闭包.请看代码: function createCompar ...

  6. 第二话:javascript中闭包的理解

    闭包是什么? 通过闭包,子函数得以访问父函数的上下文环境,即使父函数已经结束执行. OK,我来简单叙述下,先上图. 都知道函数是javascript整个世界,对象是函数,方法是函数,并且js中实质性的 ...

  7. JavaScript中闭包的理解

    1.什么是闭包 我个人理解闭包就是函数中嵌套函数,但是嵌套的那个函数必须是返回值,才构成闭包: <!DOCTYPE html> <html> <head> < ...

  8. 深入理解JavaScript的闭包特性如何给循环中的对象添加事件

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  9. 深入理解javascript的闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

  10. 【转】理解JavaScript之闭包

    闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面写下我的学习笔记~ 闭包-无处不 ...

随机推荐

  1. ETL的数据脱敏方式

    数据脱敏是什么? 数据脱敏是在数据处理过程中采用各种技术手段去除或替换敏感信息,以保障个人隐私和敏感信息的安全措施.通常应用于数据共享.数据分析和软件测试等场景,其目的在于减少数据泄露和滥用的风险. ...

  2. JAVA基础-3-标识符和关键字--九五小庞

    1.JAVA中的关键字都有哪些呢       2.java中的标识符  

  3. Linux怎么修改用户密码---九五小庞

    首先,要用CRT软件连接Linux系统. 首选,确认是用root用户登录系统的. 输入命令: id ,查看登录用户信息.  若修改root自己的密码,直接输入 passwd .  输入两遍,新密码即可 ...

  4. Linux PAM 四大认证模块详解

    以下是Linux PAM(Pluggable Authentication Modules)四大模块的​​参数详解及具体配置示例​​,结合核心参数.功能场景和实际案例说明,帮助您快速掌握配置技巧: ​ ...

  5. CF466C Number of Ways (前缀和)

    codeforces原题链接:https://codeforces.com/problemset/problem/466/C CF466C Number of Ways 题目描述 You've got ...

  6. Android实现两台手机屏幕共享和远程控制

    1 屏幕共享功能介绍 屏幕共享是指在视频通话或互动直播过程中将屏幕内容以视频的方式分享给其他的观众,以增强互动体验,提高沟通效率.屏幕共享解决方案提升了用户实时视频通话的沟通效率. 屏幕共享在如下场景 ...

  7. “代码跑着跑着,就变快了?”——揭秘Java性能幕后引擎:即时编译器

    HotSpot虚拟机内部集成了两个即时编译器,分别被称为C1编译器(Client Compiler/ Quick Complier)和C2编译器(Server Compiler).自Java 9起,- ...

  8. MyEMS:2025 年能源管理系统性价比之巅的实力担当

    在全球积极推进节能减排.追求可持续发展的大背景下,能源管理系统成为各行业实现高效用能.降低成本的关键工具.在众多能源管理系统中,MyEMS 脱颖而出,被誉为 2025 年能源管理系统中的 " ...

  9. 如何识别热点数据?采用了哪些策略来保证热点数据的响应时间小于5ms?

    识别热点数据通常可通过以下几种方法: 基于访问频率统计:利用日志记录或专门的监控工具,统计一段时间内每个数据项的访问次数.设定一个阈值,当某个数据项的访问次数超过该阈值时,将其视为热点数据.例如,通过 ...

  10. [题解]CF1063B Labyrinth

    CF1063B Labyrinth ~ Codeforces 数据范围较小,考虑使用搜索. 由于向左向右的步数限制过大,我们只能用\(x,y\)进行记忆化,否则空间和时间都过不去. 既然状态只有\(x ...