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

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

相关推荐
yzy8513 分钟前
Vue中下载或打开文件的JavaScript方法
前端·javascript·vue
用户2986985301425 分钟前
在 React 中用 JavaScript 将 Word 转换为文本
前端·javascript·react.js
计算机魔术师37 分钟前
马斯克称 Grok 4.7 使 xAI 在智能体编码领域位列第三
前端
摸鱼仙人~42 分钟前
前端秋招异步手写题系统刷题路线:从 Promise 到 Pipeline、LazyMan 与并发控制
前端
秋天的一阵风1 小时前
⚡上线 24 小时,13% 的付费团队连夜换到 Jev:它到底什么来头?
前端·人工智能·ai编程
程序员若风1 小时前
CSRF攻击原理介绍和利用-腾讯云开发者社区
前端·网络·安全·web安全·网络安全·csrf攻击·腾讯云开发者社区
风尘小子1 小时前
node.js系列:process配置
前端·node.js
恋猫de小郭1 小时前
AndroidX 新增 Security State ,支持可编程的系统安全状态查询
android·前端·flutter
IT_陈寒2 小时前
Redis大key删除引发的服务雪崩,这次我真记住了
前端·人工智能·后端
李少兄2 小时前
深入解析 JavaScript 中的 `document` 对象
javascript