当前位置:网站首页>闭包那点事儿
闭包那点事儿
2022-07-13 18:03:00 【qzwzsl】
最近打算通过一天一篇博客的方式来帮助自己消化复习一些js的重点概念 第一天就从神乎其神的闭包开始吧!
JavaScript 一个近乎神话 对于JavaScript有使用经验但却从未真正理解闭包概念的人来说,理解闭包可以说是某种意义上的重生。闭包并不是需要学习新的语法才能使用的工具。闭包的产生是基于词法作用域写代码时自然产生的结果。当你真正了解闭包之后,会发现,哦~,原来我以前所敲的代码中已经出现了很多闭包了鸭!
要想说闭包,首当其冲要说清楚作用域的事情
作用域包括
1.全局作用域
2.函数作用域
3.块级作用域(es6 新出,解决 var 问题, 新增 let, const)
作用域嵌套作用域就产生了作用域链,外部作用域访问不了内部的作用域,内部可以访问外部的,而有的时候我们就需要从外部访问内部的变量或者函数的时候(像不像我们想喝奶茶的时候束手无策的样子!),就需要用到闭包啦(像不像得到了吸管的你)!
下面写两个相关的闭包例子浅尝一下

为什么第二个result()返回的结果是2呢,因为第一次调用时的count=1被存储到了 Closure(闭包)中~

这个例子很具有迷惑性哦~
正确答案时Mike啦。是因为词法作用域(静态):js查找是按照代码书写时候的位置来决定的,而不是按照调用时候位置,在console.log(name)的时候找不到name,就直接翻出去找Mike啦。
说完例子以后,正式聊一下闭包吧
红宝书对闭包的概念是闭包是指有权访问另一个 函数作用域中的变量的函数
我的理解是当一个变量(就像上面的name)既不是该函数内部的局部变量,也不是该函数的参数,相对于作用域来说,就是一个自由变量(引用了外部变量),这样就会形成一个闭包.
下面写一个循环闭包的例子

输出是6 6 6 6 6 啦
原因是settimeout是异步任务是要在for循环(同步任务)后执行的,等执行异步任务的时候,i早就循环到6了
解决方案
1. var 改 let 利用let的块作用域属性,让每次循环都是独立的
2.

给每次settimeout套一个function,不让它矮人一等(异步要等同步执行完再执行)!
差不多就这么多!闭包YYDS!
边栏推荐
- 动态规划+组合数学
- Unity3d monobehavior base class
- Hardware course design: novel reading of multi-function player based on stm32
- JVM原理与实战
- Hardware course design: picture browsing of multi-function player based on stm32
- 【6月5号学习记录】
- 组合模式应用
- Go秒杀系统3--项目结构搭建,商品模型开发。
- 三栏布局的实现方式,(一般要求尽可能多写)
- 我这边已经把101.132.179.94加到oracle的白名单里了,仍然ping失败,请问一下该怎
猜你喜欢
随机推荐
用户模块开发
unity3d-射线
The official case of unity rubyadventure
Database dark horse notes DDL
JVM目录
拓扑排序判断有向图中是否有环
Amd rDNA 3 Navi 31 flagship GPU is said to be packaged in 3D v-cache and up to 384mb cache
SSH远程登录
Scope when multiple else if are nested
Implementation of list class template of bidirectional linked list
Programmer's daily skills
迭代分形图形的绘制
unity3d~坦克AI(小练习)
Web review
unity官方案例RubyAdventure
Implementation of binarysearchtree (BST) class template for binary search tree
ThreadLocal源码解析
程序员日常技巧
三栏布局的实现方式,(一般要求尽可能多写)
Leatcode Speech - 676. Implémenter un dictionnaire magique (difficulté: moyenne)









