闭包是什么
个人觉得闭包其实是一个很抽象的概念,因为很难用一个词语特别清晰的表达这个概念。从当前个人知识体系讲,我以为闭包是Javascript特殊的变量作用域造成的一个特殊现象,它使得Javacript的函数内部可以访问到外部变量,但是外部变量却无法访问函数内部私有变量(使用var声明的变量),而闭包则是将内外部变量结合起来的一座桥梁。
MDN的定义是:闭包是指函数有自由独立的变量。换句话说,定义在闭包中的函数可以“记忆”它创建时候的环境。
闭包的作用
闭包有两个作用:
1. 使得在函数外部可以访问到原本访问不到的变量。
2. 闭包始终被存在内存中可以用来存储变量。
闭包场景
场景一 访问函数内部变量
code:
1 | function getMyName(){ |
在这个场景下,由于子作用域可以访问到上级作用域,所以getMyName函数作为其内部函数returnMyName的上级作用域,其属性myName可以被returnMyName访问到。因此,虽然在getMyName外部虽然无法直接获取myName的值,但是通过闭包,却可以获取到其内部的属性。
场景二 存储变量
code:
JS:
1 | function changeBg(color){ |
HTML:
1 | <a href="" id="red"></a> |
这里仅仅是一个改变背景为红色的按钮,但是也可以添加更多为其他颜色的按钮,这样,存储变量的目的就达到了。
总结一下
闭包是javascript特殊的变量作用域行为导致的,由此,javascript可以有更丰富的特性。
它本质上,是对函数作用域的深入应用。而这,就是编程基础的重要之所在。