持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
在高级程序设计一书中是这样解释的。闭包:指的是那些引用了另一个函数作用域中变量的函数
当然每本书的解释都是不一样的,我是按照最新的高级程序设计给出的定义来理解。
function foo() {
var n = 1
return function() {
console.log(n) //1
}
}
foo()()
上面这段代码显然是一个闭包,在函数执行的时候定义了一个函数,也验证了红宝书的那句话,引用了父级函数foo里面的变量n。
闭包的作用
延长上级作用域内变量的生命周期
function foo(n, o) {
console.log(o)
return {
foo:function(m) {
return foo(m,n)
}
}
}
var a = foo(0);
a.foo(1)
a.foo(2)
a.foo(3)
var b = foo(0)
b.foo(1).foo(2).foo(3)
var c = foo(0).foo(1)
c.foo(2)
c.foo(3)
解释上段代码: foo函数接收两个参数n和o,函数内部return一个对象,定义一个key为foo,value为一个函数,函数里面return foo函数,采用递归调用。
var a = foo(0);
foo传递第一个参数0,此时打印结果为undefined,原因只传递第一个参数,此时n为0,o为undefined,
a.foo(1)
对象的形式去调用foo,传递参数1,此时m为1,n使用了上级作用域的值,此时n为0
a.foo(2)
同理:m为2,n为0
a.foo(3)
同理:m为3,n为0
var b = foo(0)
foo传递第一个参数0,此时打印结果为undefined,原因只传递第一个参数,此时n为0,o为undefined,
b.foo(1).foo(2).foo(3)
对象的形式去调用foo,传递参数1,此时m为1,n使用了上级作用域的值,此时n为0;继续传参,闭包中用的的n未被销毁,n=1,o=0,m赋值为2后,此时m=2,n继续使用上级作用域n的值,n为1,;继续传参,同理最后m=3,n=2
var c = foo(0).foo(1)
foo传递第一个参数0,此时打印结果为undefined,原因只传递第一个参数,此时n为0,o为undefined,继续传参1,n=1,0=0,
c.foo(2)
此时传递参数,以对象的形式调用,m=2,n=1,递归执行,n=2,o=1
c.foo(3)
此时传递参数,以对象的形式调用,m=2,n=1,递归执行,n=2,o=1
闭包有好处当然也有坏处,被引用的变量不能及时被垃圾回收机制回收,容易造成内存泄漏