一句话解释闭包,说说你对闭包的理解

一句话解释闭包,说说你对闭包的理解,让你一句话理解闭包(简单易懂)

下面小编就给大家带来一句话的理解闭合(简单易懂)。我觉得边肖挺好的。我现在就分享给你,给你一个参考。来和边肖一起看看吧。

接触javascript很久了,每次理解闭包都似是而非。最近在找Web前端的工作,需要夯实基础。

本文参考joy_lee的博客 闭包。在她的博客基础上,我尝试以评论的形式来阐述我的理解。如有不妥之处,请批评指正。

055-79000,这么说:在一个函数内部定义其他函数的时候,就创建了一个闭包。闭包可以访问包含函数内部的所有变量。

(这句话怎么理解?根据这句话,闭包是嵌套函数!当然,嵌套函数可以访问包含它们的函数的变量,这是没有问题的。)

一般来说,内部函数可以访问上层甚至全局的变量,所以有人理解为外部函数可以通过闭包访问局部区域的变量。

(如果我们简单的把作用域分成层次,假设全局作用域是第一层次,其中定义的函数体的内部作用域是第二层次,嵌套的定义的函数体的内部作用域是第二层次内的第三层次,等等。传统上,第一级不能访问第二级的变量(这样的变量称为局部变量),第二级也不能访问第三级,但反之亦然。如果在这一级的范围内找不到,就去下一级,直到第一级是全局的。闭包的机制可以通过一级作用域中的三级作用域引用二级作用域中的变量,方法是在二级作用域中将带有三级作用域的函数引用返回给一级作用域。这个引用是关键,因为这个引用的存在,相关的第三个作用域和第二个作用域就成了这个引用运行的上下文,迫使垃圾收集机制GC不去回收这个链中占用的资源。如果没有这个引用,函数运行后资源会被回收,就像普通函数一样。而我的困惑就在于此。闭包引用的是函数中的嵌套函数还是第一级引用的嵌套函数?还是两者都有?还是闭包不是嵌套函数,而是嵌套函数被一级作用域引用时形成的机制?)

函数a(){

var I=0;

函数b(){

警报(一);

}

返回b;

}

var c=a();

c();

即closure的作用是让Javascript的垃圾收集机制GC在A执行返回后不回收A占用的资源,因为A的内部函数B的执行依赖于A中的变量。

由于闭包的存在,A中的I在函数A返回后始终存在,这样每次执行C()时,I就是加1后提醒我的值。

那么,如果A不返回函数B,情况就完全不同了。因为A执行后,B并没有返回到A的外部,而是只被A引用,此时A只会被B引用。因此,如果函数A和B相互引用但不受外界干扰(被外界引用),函数A和B将被GC回收。

实际上,闭包延长了变量的生命周期。通常函数的作用域,也就是变量,在函数执行后会被销毁,但当函数返回闭包时,只要闭包没有释放,整个作用域链都会占用内存。(闭包延长了变量的生命周期,是指被第一级引用的情况。但是没有这个参照物,闭包还能叫闭包吗?)

作用域链说,即函数本身的作用域、前一个函数的作用域和全局作用域。在访问一个变量的时候,如果你没有,你会一层一层的找,直到整个情况。如果没有,就会报错。

(我很想抱怨闭包的作用域链是弯曲的。)

PS:有网友推荐另一篇文章javascript闭包概念简单解析。无论是否权威,我们终于有了一个清晰的概念:

说了这么多,闭包到底是什么,下面做一下总结:

闭包是一个概念,描述的是函数执行后释放内存后内存仍然驻留的一种现象。只要抓住这个核心概念,封闭就不难理解。

以上一句话让你明白closure(简单易懂)就是边肖分享的全部内容。希望能给大家一个参考,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: