网站首页 > 技术文章 正文
点关注,不迷路,每天大量前端资料更新
闭包
function fn1(){ var a = 2 function fn2(){ conso1e.log(a) //fn2引用了fn1函数中的变量a,产生了闭包 } } fn1()
如何产生闭包
当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)就产生了闭包(满足了这个条件就是闭包),如上例子
闭包到底是什么
通过Chrome中的调试工具查看
理解一:闭包是嵌套的内部函数(绝大部分人)认为上例子中的fn2
理解二:包含在被引用变量(函数)的对象(极少数人)认为上例子的变量a
注意:闭包产生在嵌套的内部函数中
产生闭包的条件
1.函数嵌套
2.内部函数引用了外部函数的数据(变量或函数)
3.外部函数被执行(不用调用内部函数)
常见的闭包
1.将一个函数作为另一个函数的返回值
2.将函数作为实参传递给另一个函数调用
1.将一个函数作为另一个函数的返回值
function fn1(){ var a = 2 function fn2(){ a++ conso1e.log(a) } return fn2 } var f = fn1() f() //3 f() //4 f = null //在嵌套的内部函数成为垃圾对象,就是闭包死亡
2.将函数作为实参传递给另一个函数调用
function showDelay(msg,time){ setTimeout(function(){ alert(msg) },time) } showDelay('alibaba',2000)
闭包的作用
使用函数内部的变量在函数执行后,仍然存活在内存中(延长了局部变量的生命周期)
让函数外部可以操作读写到函数内部的数据
函数执行完后,函数内部声明的局部变量是否还存在?
一般不存在,在有闭包的情况下,存在,仅仅闭包中的变量在闭包中,在函数执行完后存在,别的在函数执行完后都会释放
在函数外部能直接访问函数内部的局部变量吗?
不能,但是闭包的技术可以
闭包的产生,在嵌套的内部函数定义执行完就产生了(不是在执行时)
死亡:在嵌套的内部函数成为垃圾对象,就是死亡
闭包的应用:
1.定义js模块:具有特定功能的js文件,将所有的数据和功能都封装在一个函数内部中
只向外暴露一个包含n个方法的对象或者函数,模块的使用者,只需要通过模块暴露的对象调用方法
来实现对应的功能
myModule.js如下
function myModule(){ var msg = 'alibaba' function doSomething(){ conso1e.log('doSomething()'+msg.toUpperCase()) } function doOtherthing(){ conso1e.log('doOtherthing()'+msg.toLowerCase()) } //向外暴露一个包含n个方法的对象或者函数 return{ doSomething:doSomething doOtherthing:doOtherthing } }
然后引入
<script src = 'myModule.js'></script> <script> var moulder = myModule moulder.doSomething() moulder.doOtherthing() </script>
闭包的缺点与解决方法
函数执行完后,函数内的局部变量没有释放,占用内存时间会变长
容易造成内存泄漏
function fn1(){ var arr = new Array[1000000] function fn2(){ conso1e.log(arr.length) } return fn2 } var f = fn1() f = null //解决方法
解决
能不用闭包就不用,及时释放
内存泄露与内存溢出
内存溢出
一种程序运行出现的错误
当程序运行需要的内存超过剩余的内存时,就抛出了内存溢出的错误
内存溢出
var obj = {} for (var i = 0;i<10000;i++){ obj[i] = new Array(1000000000) }
内存泄露
占用的内存没有及时释放
内存泄露积累多了就容易导致内存溢出
常见的内存泄露:
1.意外的全局变量
2.没有及时清理的计时器或回调函数
3.闭包
1.意外的全局变量
function fn(){ a = new Array(1000000) //用var来申明才对 conso1e.log(a) } fn() 在fn()执行后a并没有被释放
2.建立的定时器,必须清除
3.闭包
function fn1(){ var arr = new Array[1000000] function fn2(){ conso1e.log(arr.length) } return fn2 } var f = fn1() //没有f = null
- 上一篇: 详解 js 闭包(图文版) js闭包是什么
- 下一篇: 小白的前端练级之路——面向对象编程(闭包)
猜你喜欢
- 2025-06-23 JavaScript 开发者常犯的 10 个典型错误
- 2025-06-23 这7道问题可以检验你掌握Javascript的真正实力
- 2025-06-23 HarmonyOS NEXT 如何有效地进行内存管理和避免内存泄露?
- 2025-06-23 JS 函数柯里化(js函数柯里化面试题)
- 2025-06-23 《深入理解javascript原型和闭包系列》 知识点整理
- 2025-06-23 JS面试题突破:什么是闭包?(闭包 js)
- 2025-06-23 JavaScript闭包(javascript 闭包)
- 2025-06-23 “闭包到底是什么?90% 的前端开发者都没真正搞懂!”
- 2024-10-04 两个小案例让你深入理解 Javascript 闭包和作用域
- 2024-10-04 js中的闭包 js闭包的使用
你 发表评论:
欢迎- 06-24发现一款开源宝藏级工作流低代码快速开发平台
- 06-24程序员危险了,这是一个 无代码平台+AI+code做项目的案例
- 06-24一款全新的工作流,低代码快速开发平台
- 06-24如何用好AI,改造自己的设计工作流?
- 06-24濮阳网站开发(濮阳网站建设)
- 06-24AI 如何重塑前端开发,我们该如何适应
- 06-24应届生靠这个Java简历模板拿下了5个offer
- 06-24服务端性能测试实战3-性能测试脚本开发
- 561℃Oracle分析函数之Lag和Lead()使用
- 556℃几个Oracle空值处理函数 oracle处理null值的函数
- 546℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 542℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 539℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 531℃【数据统计分析】详解Oracle分组函数之CUBE
- 519℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 510℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)