详细分析闭包是什么 Love The Way You Lie 2022-05-13 15:34 124阅读 0赞 ## 什么是闭包 ## 有权访问另一个函数作用域中的变量的函数。通俗地讲,一个函数有权去访问另一个函数作用域中的变量,这个函数就称为闭包。闭包函数在执行完以后,这个函数中还存在一部分在内存当中,没有被垃圾回收机制回收。 **来个例子:** var test = function father() { var data = 'from father'; return function son() { return data; } }(); console.log(test()); //输出 'from father' **解析一下这段代码:** 首先这里定义了一个 test 变量,这里 father 后面加了个(),说明他自执行了,return 了一个函数 son 赋值给到 test,那么现在 test 被赋的值是 son 这个函数,接下来执行 test 函数,也就是执行 son 函数,son 函数又将外层的在 father 函数内部的 data return 了出去,于是输出了 form father。也就是说,son 函数访问到了 father 函数内部的变量 data,形成了闭包。 ## 为什么要用闭包 ## 因为js的函数作用域的关系,一般情况下外部是访问不了函数内部的变量的,设计闭包结构就可以访问到函数内部的变量,还有就是闭包可以让变量长期保存在内存里,生命周期较长 ## 闭包应用 ## for循环异步问题,函数防抖及函数节流问题,封装私有变量等等。 **for循环异步问题:** 先看一个例子(来自牛客网): <ul> <li>click me</li> <li>click me</li> <li>click me</li> <li>click me</li> </ul> var elements = document.getElementsByTagName('li'); var length = elements.length; for (var i = 0; i < length; i++) { elements[i].onclick = function () { alert(i); } } 点击之后,输出是 4,为什么不是分别的0,1,2,3 呢? 解析一下这段代码: 首先 for 循环是同步机制,onclick 是异步机制,这里 for 循环执行的时候,遇到了 onclick 事件,因为 onclick 是异步,于是把它放在异步队列中,继续执行 for 循环,直到 i = 4 了,开始依次执行异步队列的 onclick 函数,onclick 函数中 alert 了 i 这个变量,这个 i 变量呢,就是来自 for (var i = 0; i < length; i++) 中的 i,注意看,这个 i 是 全局变量,也就是说,onclick 函数 alert 的 i 是来自全局的变量 i,前面说到 i 已经是 4 了,所以实际上 alert 的 i 就是全局变量的 i 也就是 4 了。 使用闭包解决: var elements = document.getElementsByTagName('li'); var length = elements.length; for (var i = 0; i < length; i++) { elements[i].onclick = function father (num) { return function son () { alert (num) } }(i) } 输出是 0,1,2,3,这次达到目的了。 解析一下这段代码: 修改过后,按照之前的逻辑,for 循环先执行完,开始依次执行异步队列中的 onclick 函数,这里可以开始看 onclick 被赋值了什么,先看 father 函数,看到它后面有个 (i),说明这里它自执行了并且将那一次循环中的 i 作为参数传进了 father 函数中,father 函数执行后,return 了一个 son 函数,最终这个 son 函数赋值到 onclick,现在开始点击页面中的 li 标签,就会执行刚才赋值的 son 函数,son 函数会 alert num 这个变量,再看看 num 这个变量从哪儿来,num 这个变量来自于 函数 father 从外界接收的参数,也就是在 for 循环时传给 father 函数的参数 i,而这个 i 参数从哪来,是分别从 i = 0、1、2、3 的时候传进去的,最后输出也就是 0,1,2,3。 **缺点**:如果闭包滥用会造成内存泄露,影响页面性能,每次用完之后要立刻释放资源,把引用指针指向null
相关 什么是闭包,Python闭包 ![2486780da7c98c38639e15a45aed34fb.png][] 闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函数类似,不同之处在于,闭包中外部函数返 不念不忘少年蓝@/ 2023年10月07日 22:57/ 0 赞/ 47 阅读
相关 什么是闭包? 闭包 我们都知道,js的作用域分两种,全局和局部,基于我们所熟悉的作用域链相关知识,我们知道在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的 £神魔★判官ぃ/ 2022年11月22日 05:27/ 0 赞/ 183 阅读
相关 什么是闭包! [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 什么是闭包? 就是有权访问另一个函数的作用域内的变量就 曾经终败给现在/ 2022年10月02日 00:32/ 0 赞/ 212 阅读
相关 什么是闭包 \----本文摘自programming in lua 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包 超、凢脫俗/ 2022年08月23日 12:47/ 0 赞/ 197 阅读
相关 什么是闭包 什么是闭包? 简单来说,闭包是指外部可以访问另一个函数作用域内的变量的函数,一般是定义在外层函数中的内层函数。 为什么需要闭包? 局部变量无法共享和长久的保存,而全局变量 r囧r小猫/ 2022年05月28日 08:35/ 0 赞/ 252 阅读
相关 详细分析闭包是什么 什么是闭包 有权访问另一个函数作用域中的变量的函数。通俗地讲,一个函数有权去访问另一个函数作用域中的变量,这个函数就称为闭包。闭包函数在执行完以后,这个函数中还存在一部分 Love The Way You Lie/ 2022年05月13日 15:34/ 0 赞/ 125 阅读
相关 什么是闭包? 闭包是指有权访问另一个函数作用域中变量的函数 作用:访问另一个函数作用域中变量 原理:通过匿名式函数把局部变量驻留在内存里,可以减少全局变量的使用 优点是封装性, 水深无声/ 2021年11月17日 02:50/ 0 赞/ 668 阅读
相关 什么是闭包? 什么是闭包? 说明 闭包 有些读者可能很好奇,为什么闭包会成为一个独立的概念,以及为什么它需要编程语言提供额外的支持。这些疑惑可以本文中找到答案。 - 日理万妓/ 2021年09月25日 03:46/ 0 赞/ 415 阅读
相关 闭包是什么? 1.什么是闭包? 古老定义 闭包(closure),是指函数变量可以保存在函数作用域内,因此看起来是函数将变量“包裹”了起来 那这样说来,包含变量的函数就是闭 骑猪看日落/ 2021年09月14日 11:32/ 0 赞/ 415 阅读
相关 什么是闭包? 闭包 定义:闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链 你的名字/ 2021年09月14日 08:38/ 0 赞/ 443 阅读
还没有评论,来说两句吧...