【JS基础】闭包

在阅读vue源码时发现vue源码大量运用了闭包的技巧来实现某些特性,发现自己并不是真的理解闭包,所以写这篇文章来深入学习闭包

闭包的概念

闭包是 JS 的常见概念,它是一个函数嵌套了内部函数,并返回这个内部函数的形式,返回的内部函数引用了外层函数的变量,就会以闭包的形式保存下来。

MDN上的解释:闭包 (closure)是一个函数以及其捆绑的周边环境状态(lexical environment词法环境)的引用的组合。

可能我们在书写js代码时,不知不觉中已经使用了闭包。我们从下边这段代码具体来看一下:

javascript 复制代码
function foo() {
  var a = 2;

  function bar() {
    console.log(a);
  }

  return bar;
}

var baz = foo();
baz(); // 2------朋友,这就是闭包的效果。

这段代码中,函数foo(),内部有一个局部变量a以及一个函数bar(),并且返回了函数bar。 在foo执行后,通常会觉得foo内部的作用域已经销毁,它内部的a变量应该不复存在。但由于闭包的性质,函数bar()内部引用foo的内部作用域,而这个引用就叫做闭包。

闭包的用处

闭包给JavaScript代码带来了很多的灵活性,它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。 来看下边这段代码:

javascript 复制代码
// 函数add返回了一个内部函数,这个内部函数持有add的参数的引用。
function add(a){
	return (b)=> b+a
}
const add5 = add(5) // add5通过闭包的性质可以引用add的局部变量a。
add5(1) //6

理解闭包

要理解闭包,需要理解作用域链。还是以上文中的代码为例: 内部函数的作用域链中持有add函数的活动对象,所以在add函数执行完返回内部函数后,add函数的活动对象a仍然不会被销毁,直到持有内部函数的引用的对象全部被销毁后。

使用闭包的注意点

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

相关推荐
leoZ2311 分钟前
AI+前端提效-12 AI辅助前端性能优化与监控:从开发到线上全流程提效
前端·人工智能·神经网络·自然语言处理·性能优化·keras·知识图谱
阿图灵3 分钟前
LangGraph 实战 03:Workflows 与 Agents——六种工作流模式与智能体实战(附 6 个可运行示例)
java·前端·javascript·工作流·ai agent·智能体·langgraph
狂炫冰美式8 分钟前
电脑合盖之后 Cursor 还在偷我电?看看为啥
前端·人工智能·后端
leeyi9 分钟前
微前端:14 个子应用是怎么做到不散架的——DeepFlux 前端工程拆解(第102篇)
前端·aigc·agent
天道kabuto35 分钟前
踩坑实录:JS Map迭代器为什么“用完即焚”?兼谈技术知识沉淀
前端
字节跳动开源39 分钟前
VisActor全新图可视化开源项目:VGraph
前端·设计模式·开源
打呵欠的猫41 分钟前
前端接口超时从 15s 改到动态值后,用户投诉降了 60%——AI 帮我分析出的方案
前端·ai编程
岁月宁静41 分钟前
二、《从零手撸 Agent》 — 聊聊 LLM 的失忆真相
前端·python·agent
郭邯1 小时前
用纯前端实现一个代码压缩美化工具,我踩了这三个坑
前端
用户283209679371 小时前
从进程线程到 async/await:JS Event-loop事件循环机制底层解析
前端·javascript