MST
星途 面试题库

面试题:JavaScript函数实参与形参传递中的闭包影响

假设有如下代码:function outer() { let a = 10; function inner(b) { return a + b; } return inner; } let func = outer(); 这里涉及到实参和形参传递,解释闭包在这个过程中是如何影响变量的访问和生命周期的。
23.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

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