1、闭包的概念
官方解释:闭包就是能够读取其他函数内部变量的函数。在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
闭包是函数和声明该函数的词法环境的组合。
2、词法作用域
init()
创建了一个局部变量 name
和一个名为 displayName()
的函数。displayName()
是定义在 init()
里的内部函数,仅在该函数体内可用。displayName()
内没有自己的局部变量,然而它可以访问到外部函数的变量,所以 displayName()
可以使用父函数 init()
中声明的变量 name
。但是,如果有同名变量 name
在 displayName()
中被定义,则会使用 displayName()
中定义的 name
。
3、闭包实例
定义了 makeAdder(x)
函数,它接受一个参数 x
,并返回一个新的函数。返回的函数接受一个参数 y
,并返回x+y
的值。从本质上讲,makeAdder
是一个函数工厂 — 他创建了将指定的值和它的参数相加求和的函数。在上面的示例中,我们使用函数工厂创建了两个新函数 — 一个将其参数和 5 求和,另一个和 10 求和。add5
和 add10
都是闭包。它们共享相同的函数定义,但是保存了不同的词法环境。在 add5
的环境中,x
为 5。而在 add10
中,x
则为 10。
注意:当打印add5的时候,是执行了makeAdder方法并将值赋给x,此时这个函数有了一个上下文环境,打印add5的时候会把内部函数打印出出来,此时内部函数不会被执行,当调用add5(2)的时候才执行。
输出结果: