什么是闭包? 冷不防 2022-11-26 14:56 200阅读 0赞 ## 我们都知道一个概念。 ## 在JS当中,一个函数可以访问其外部的变量资源。 ![format_png][] 一个典型的代码 **但以下这种情况会出错。** function m1(){ var a = 100; console.log(a++); } function m2(){ console.log(a++); //这里无法访问a } 如果,我们想在m2的作用域里,访问m1里的变量,就像下面这样: ![format_png 1][] 首先,我们可以在m1的内部创建一个函数m3 function m1(){ var a = 100; function m3(){ console.log(a++); } } ![format_png 2][] m3可以正常访问a,接下来我们增加一个return操作。 function m1(){ var a = 100; return function m3(){ console.log(a++); } } 既然有了返回值,那我们不妨接收一下,继续编写代码如下: function m1(){ var a = 100; return function m3(){ console.log(a++); } } var _m3 = m1(); 我们执行了函数**m1**, 并将返回值赋值给**\_m3**, 那么目前**\_m3**和**m3**函数是等价的,即它们是同一个函数。 **有了\_m3,一切都好办了。我们继续编写代码** function m1(){ var a = 100; return function m3(){ console.log(a++); } } var _m3 = m1(); function m2(){ _m3(); } 因为**\_m3**是全局变量,因此**m2**可以调用**\_m3** 也就等价于**m2**间接的,访问到了变量**a** ![format_png 3][] 通常,我们管**m3**,叫做一个**『 闭包函数 』** **下面列举几个常见的闭包场景:** **01** for(var i=0; i<list.length; i++){ var item = list[i]; item.onclick = (function(num){ return function(){ //...... } })(i); } **02** function (){ var that = this; setTimeout(function(){ //...... },2000) } **03** function User(){ var _age = 0; this.getAge = function(){ return _age; } this.setAge = function(age){ this._age = age; } } **04** (function(){ var cache = [...]; return { get : function(){ //... } }; })() **05** (function(){ var t = null; return function(){ if(!t){ t = create(); } } })() ## 为了创造闭包,有时候会写函数自调用 ## ## 可以不这么麻烦么?? ## 当然,那就是使用let。 例如 for(let i=0; i<list.length; i++){ let item = list[i]; item.onclick = function(){ console.log(i); //观察变量i的值 }; } **关于闭包的疑问** 当函数**m1**执行完成的时候,内部的变量**a**,理论上应该被回收掉了。 ![format_png 4][] 可是为什么变量**a**依然可以被访问呢? 主要是因为,**m3**还在引用它 ![format_png 5][] 垃圾回收器显然不会回收一个依然被引用的变量。 除非这个变量,已经无人引用,即是说,它已经无法再内存里被找到。 此时才可以当做垃圾处理。 不过m3可以访问变量a这种规则,并不是在所有编程语言里都生效的。因此,这也算是JS的特性之一。 [format_png]: /images/20221124/89191041dbf741c8bb7cfd201fe5cb4c.png [format_png 1]: /images/20221124/b2dd72550c0b4512a5241a7aa284f4bf.png [format_png 2]: /images/20221124/d007ec153cd14a1c930d23d3660e9d22.png [format_png 3]: /images/20221124/45384954a5384be5bea315b5a3a918cb.png [format_png 4]: /images/20221124/f776abaa1d97484d9a1dd17ee36c3a80.png [format_png 5]: /images/20221124/79c97b601255462989bee817f98e0e33.png
相关 什么是闭包,Python闭包 ![2486780da7c98c38639e15a45aed34fb.png][] 闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函数类似,不同之处在于,闭包中外部函数返 不念不忘少年蓝@/ 2023年10月07日 22:57/ 0 赞/ 62 阅读
相关 什么是闭包? 我们都知道一个概念。 在JS当中,一个函数可以访问其外部的变量资源。 ![format_png][] 一个典型的代码 但以下这种情况会出错。 fun 冷不防/ 2022年11月26日 14:56/ 0 赞/ 201 阅读
相关 什么是闭包? 闭包 我们都知道,js的作用域分两种,全局和局部,基于我们所熟悉的作用域链相关知识,我们知道在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的 £神魔★判官ぃ/ 2022年11月22日 05:27/ 0 赞/ 201 阅读
相关 什么是闭包! [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 什么是闭包? 就是有权访问另一个函数的作用域内的变量就 曾经终败给现在/ 2022年10月02日 00:32/ 0 赞/ 225 阅读
相关 什么是闭包 \----本文摘自programming in lua 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包 超、凢脫俗/ 2022年08月23日 12:47/ 0 赞/ 212 阅读
相关 什么是闭包 什么是闭包? 简单来说,闭包是指外部可以访问另一个函数作用域内的变量的函数,一般是定义在外层函数中的内层函数。 为什么需要闭包? 局部变量无法共享和长久的保存,而全局变量 r囧r小猫/ 2022年05月28日 08:35/ 0 赞/ 267 阅读
相关 什么是闭包? 闭包是指有权访问另一个函数作用域中变量的函数 作用:访问另一个函数作用域中变量 原理:通过匿名式函数把局部变量驻留在内存里,可以减少全局变量的使用 优点是封装性, 水深无声/ 2021年11月17日 02:50/ 0 赞/ 717 阅读
相关 什么是闭包? 什么是闭包? 说明 闭包 有些读者可能很好奇,为什么闭包会成为一个独立的概念,以及为什么它需要编程语言提供额外的支持。这些疑惑可以本文中找到答案。 - 日理万妓/ 2021年09月25日 03:46/ 0 赞/ 432 阅读
相关 闭包是什么? 1.什么是闭包? 古老定义 闭包(closure),是指函数变量可以保存在函数作用域内,因此看起来是函数将变量“包裹”了起来 那这样说来,包含变量的函数就是闭 骑猪看日落/ 2021年09月14日 11:32/ 0 赞/ 434 阅读
相关 什么是闭包? 闭包 定义:闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链 你的名字/ 2021年09月14日 08:38/ 0 赞/ 463 阅读
还没有评论,来说两句吧...