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

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

相关推荐
南山安4 小时前
Tailwind CSS:顺风CSS
javascript·css·react.js
milanleon4 小时前
使用Spring Security进行登录认证
java·前端·spring
excel4 小时前
🚀 从零开始:如何从 GPTsAPI.net 申请 API Key 并打造自己的 AI 服务
前端
期待のcode5 小时前
@RequestBody的伪表单提交场景
java·前端·vue.js·后端
栀秋6665 小时前
防抖 vs 节流:从百度搜索到京东电商,看前端性能优化的“节奏哲学”
前端·javascript
一颗烂土豆5 小时前
vfit.js v2.0.0 发布:精简、语义化与核心重构 🎉
前端·vue.js·响应式设计
有意义5 小时前
深入防抖与节流:从闭包原理到性能优化实战
前端·javascript·面试
可观测性用观测云6 小时前
网站/接口可用性拨测最佳实践
前端
2503_928411566 小时前
12.26 小程序问题和解决
前端·javascript·微信小程序·小程序
灼华_6 小时前
超详细 Vue CLI 移动端预览插件实战:支持本地/TPGZ/NPM/Git 多场景使用(小白零基础入门)
前端