面试题答案
一键面试- 闭包的形成:
- 在这段代码中,
inner
函数定义在outer
函数内部,并且inner
函数访问了outer
函数作用域中的变量a
。当outer
函数返回inner
函数时,inner
函数连同它对outer
函数作用域的引用一起被返回,从而形成了闭包。
- 在这段代码中,
- 变量的访问:
- 形参
b
:inner
函数的形参b
是在inner
函数被调用时传入的实参的占位符。当func
(即返回的inner
函数)被调用时,传入的实参值会被赋给形参b
。例如,如果执行func(5)
,那么b
的值就是5。 - 变量
a
:由于闭包的存在,inner
函数可以访问并使用outer
函数作用域中的变量a
。即使outer
函数已经执行完毕并返回,inner
函数仍然可以访问a
的值(这里a
的值为10)。这是因为闭包会保留对创建它的外部函数作用域的引用,使得在外部函数执行结束后,其作用域中的变量不会被垃圾回收机制回收,仍然可供闭包函数使用。
- 形参
- 变量的生命周期:
- 正常情况:在JavaScript中,函数执行完毕后,其局部变量通常会被垃圾回收机制回收,内存被释放。如果没有闭包,
outer
函数执行结束后,变量a
应该会被回收。 - 闭包影响:但由于闭包的存在,
inner
函数持有对outer
函数作用域的引用,这就导致outer
函数作用域中的变量a
的生命周期被延长。只要inner
函数(这里通过func
引用)仍然存在于内存中,a
就不会被垃圾回收。只有当func
不再被引用(例如设置为null
),并且没有其他对outer
函数作用域的引用时,a
所占用的内存才会被回收。
- 正常情况:在JavaScript中,函数执行完毕后,其局部变量通常会被垃圾回收机制回收,内存被释放。如果没有闭包,