什么是闭包closure
先看下面这段代码:
1 | var name = 'Joey' |
这段代码最终会打印出Joey
这个名字,这是JS语言的独特之处,就是函数内部可以读取到外部的变量。
在这段代码中,具有两个作用域scope
,一个是整段代码处于一个作用域,另一个是function函数里面有一个作用域。函数内部可以访问到外部的变量name
。
其实这个printName
函数就是一个闭包。闭包就是能够访问其他函数内部变量的函数。但是这个闭包并不是我们经常说的闭包。在理解现在的闭包的概念之前,我们再看一段代码:
1 | var name = 'Joey' |
这段代码会报错,原因是因为在函数外部自然无法读取函数内的变量。
那如何在函数外部访问到函数内部的变量呢?
在函数内部在定义一个函数,然后返回该函数
1 | var name = 'Joey' |
在这段代码中,因为函数内部可以访问到外部的变量,所以printAge
函数可以访问到外部的age
变量。因此,只要return printAge
就可以在外部最外部的作用域中访问到age
这个变量。
这段代码中printAge
函数就是一个闭包,这也是我们现在认为的闭包。
闭包的概念
闭包就是能够读取其他函数内部变量的函数,简答来讲就是,闭包就是函数内部的函数。
闭包的作用
- 读取函数内部的变量
- 让函数内部的变量保存在内存中。函数内部的变量为局部变量,闭包的作用,就是把函数的内部的局部变量变成了全局变量。