为什么说闭包是Javascript一个非常重要的难点?

大家好,我是梦兽编程。UP 主会经常在网上分享一些编程经验与项目经验。

主要是realibox.comrealihub.com/ai-design 这些在线gui工具为主。

space.bilibili.com/106325238?s... 个人B站号

如果你想你的项目经验得到想的灵感可以关注梦兽编程

学习 Javascript 闭包(Closure)

闭包(Closure)是 javascript 语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。包括React中常用的useEffect,use Callback; 所以理解了闭包对 javascript 有了一个更深了的了解。对于很多 bug 都可以快速定位到问题。

什么是闭包?

大家可以想象一下,我们把书本放到书包里面。然后把拉链拉起来。这个关闭的书包相当于 javascript 里面的闭包。存放在书包里面的书本,我们什么时候想查看打开书包就能查看了。

如何形成闭包

js 复制代码
function fn1() {
  const a = "rex";
  function fn2() {
    // 在fn2 的作用域中 打印一个没有定义的变量a 依然能访问
    // 这就形成最简单的闭包形式
    console.log(a);
  }
}

如果我们把以上的代码修改一下,在 fn2 中没有引用 b 的变量。我们能在闭包中获取到 b 的变量吗?

js 复制代码
function fn1() {
  const a = "rex";
  const b = "web";
  function fn2() {
    // 在fn2 的作用域中 打印一个没有定义的变量a 依然能访问
    // 这就形成最简单的闭包形式
    console.log(a);
  }
}

所以形成闭包的首要条件是内部函数引用了嵌套父节点以上外部函数的变量成员变量时候才能形成闭包。

闭包的到底在 javascript 中解决那些问题?

变量私有什么的请不要在听网上的八股文了,js 中的函数就是一个对象。函数里面定义的变量就已经可以私有化。

传统的 javascript,es6 之前没有诞生之前。js 是没有块级作用域。它只有函数和全局作用域两种类型。 在其他语言当中它有代码块。

如果你的变量作用在函数作用域里,一般执行完成函数后就会马上释放,包括函数自身也会被释放掉。

所以闭包的作用很多时候是为了防止你的变量被函数执行完后被释放掉...

有了这个概念后我们在看看一下的代码,这函数范式里面典型的类面向对象写法

js 复制代码
function human(n) {
  const name = n;
  function sayHi() {
    console.log(`Hi I am ${name}`)
  }
  function sayHowYouFeel() {
    console.log(`${name} is feeling good!`)
  }
  return {
    sayHi,
    sayHowYouFeel
  }
}

设想一下,如果没有闭包保存变量的操作会发生什么事情?

js 复制代码
const rex = human('rex') //执行完函数 name 被释放
rex.sayHi() // out -> Hi I am undefind

是不是感觉很奇怪呢? 所以闭包也成为了js的一个比较重要的内容。

好了今天的内容到这里就已经结束了。如果对你的学习得到什么启发或者帮助。不妨给UP一个三连支持一下。 你的三连是创作的最大动力。

现在关注梦兽编程,有什么项目经验或者动态你可以马上关注到。

相关推荐
尘中客3 小时前
放弃 Echarts?前端直接渲染后端高精度 SVG 矢量图流的踩坑记录
前端·javascript·echarts·前端开发·svg矢量图·echarts避坑
FreeBuf_3 小时前
Chrome 0Day漏洞遭野外利用
前端·chrome
小彭努力中4 小时前
199.Vue3 + OpenLayers 实现:点击 / 拖动地图播放音频
前端·vue.js·音视频·openlayers·animate
2501_916007474 小时前
网站爬虫原理,基于浏览器点击行为还原可接口请求
前端·javascript·爬虫·ios·小程序·uni-app·iphone
前端大波4 小时前
Sentry 每日错误巡检自动化:设计思路与上手实战
前端·自动化·sentry
Highcharts.js5 小时前
适合报表系统的可视化图表|Highcharts支持直接导出PNG和PDF
javascript·数据库·react.js·pdf
ZC跨境爬虫5 小时前
使用Claude Code开发校园交友平台前端UI全记录(含架构、坑点、登录逻辑及算法)
前端·ui·架构
慧一居士5 小时前
Vue项目中,何时使用布局、子组件嵌套、插槽 对应的使用场景,和完整的使用示例
前端·vue.js
叫我一声阿雷吧5 小时前
JS 入门通关手册(35):执行上下文、调用栈与作用域链深度解析
javascript·作用域链·js进阶·执行上下文·调用栈·变量提升·闭包原理
Можно5 小时前
uni.request 和 axios 的区别?前端请求库全面对比
前端·uni-app