为什么说闭包是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一个三连支持一下。 你的三连是创作的最大动力。

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

相关推荐
海天胜景11 分钟前
jqGrid冻结列错行问题,将冻结表格(悬浮表格)与 正常表格进行高度同步
前端
清风细雨_林木木36 分钟前
解决 Tailwind CSS 代码冗余问题
前端·css
HSunR39 分钟前
vue3 elementplus tabs切换实现
javascript·vue.js·elementui
搏博44 分钟前
WPS中代码段的识别方法及JS宏实现
开发语言·javascript·wps
三天不学习1 小时前
VueUse/Core:提升Vue开发效率的实用工具库
前端·javascript·vue.js·vueuse
好青崧1 小时前
等于和绝对等于的区别
javascript
余道各努力,千里自同风1 小时前
CSS实现文本自动平衡text-wrap: balance
前端·css
半青年2 小时前
Qt图表库推荐指南与分析
c语言·开发语言·javascript·c++·qt·信息可视化
Yvonne爱编码2 小时前
CSS- 4.3 绝对定位(position: absolute)&学校官网导航栏实例
前端·css·html·html5·hbuilder
繁依Fanyi2 小时前
ImgShrink:摄影暗房里的在线图片压缩工具开发记
开发语言·前端·codebuddy首席试玩官