1.什么是闭包
创始人
2024-02-23 07:55:58

什么是闭包

1. 概念

闭包(closure)指有权访问另一个函数作用域中变量的函数。—《JavaScript高级程设计》

简单理解就是一个函数。

在这里插入图片描述

2. 如何产生闭包?

当一个嵌套的内部函数引用了嵌套的外部函数的变量(函数)时,就产生了闭包.

3. 闭包到底是什么?

3.1 代码:

function fn1 () {debuggervar a = 123var b = 123function fn2 () {console.log(a)}fn2()
}fn1()

浏览器 debugger 中的截图:

在这里插入图片描述

3.2 思考:

  • 可以在浏览器的debugger查看, Closure

    • 理解一:闭包是嵌套的内部函数

    • 理解二:包含被引用变量(函数)的对象

      注意:闭包存在于嵌套的内部函数中

看到浏览器的调试工具:在外层函数的作用域中,存储着内部函数,内部函数身上有一个内部属性 [[Scopes]] 里面存储着 Closure

3.3 产生闭包的条件?

  1. 函数嵌套

  2. 内部函数引用了外部函数的数据(变量/函数)

  3. 调用了外部函数。

4. 闭包的思考

4.1 闭包的作用

  • 使函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)

  • 让函数外部可以操作(读写)到函数内部的数据(变量/函数)

4.2 闭包的应用

  1. 将函数作为另一个函数的返回值
  2. 将函数作为实参传递给另一个函数调用

模块化中的使用

;(function (window) {let str = 'tomato777'function foo() {console.log(`foo() ${str}`)}function bar() {console.log(`bar() ${str}`)otherFun()}function otherFun() {console.log('otherFun()')}window.myModule = { foo, bar }
})(window)console.log('myModule', myModule)
// {foo: ƒ, bar: ƒ}console.log('myModule.str', myModule.str)
// undefined

可以保证变量私有,但是又可以通过我们自己暴露的方法去修改这个变量。

for循环中使用的场景:

var arr = []
for (var i = 0; i < 5; i++) {arr[i] = function fn() {console.log(i)}
}arr.forEach((item) => {item()
})
/* 
5
5
5
5
5因为 arr 中存储的函数中的i都是使用的for循环中的`var i`解决方案1: var改为let解决方案2: 利用闭包,在赋值的代码外层包裹一层函数,形成闭包。代码如下
var arr = []
for (var i = 0; i < 5; i++) {;((i) => {arr[i] = function fn() {console.log(i)}})(i)
}arr.forEach((item) => {item()
})*/

4.3 闭包的生命周期

  1. 产生:嵌套内部函数定义执行完毕之后就产生了(不是在调用)
  2. 死亡:在嵌套的内部函数成为垃圾对象时

4.4 闭包优缺点

  1. 缺点
    • 函数执行完后,函数内的局部变量没有释放,占用内存时间会变长
    • 容易造成内存泄露
  2. 解决
    • 能不用就不用
    • 及时释放

End

说说自己的想法:

闭包可以说,是从我开始学习 JavaScript 的那天开始,就频繁遇到的名词。

1. 有权访问另一个函数作用域中变量的函数

2. 闭包是一种引用关系,该引用存在于内部函数中,引用的是外部函数中的局部变量。

  • 用我自己的理解来说,闭包就是一个对象,存储在内部函数中,记录了内部函数对外部函数的局部变量的引用。实现了,当外部函数执行完毕以后,在内部函数中,依旧可以访问到外部函数中的局部变量。
  • 当然,理解成函数,理解成对象,本质上无差别。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...