MST

星途 面试题库

面试题:JavaScript作用域链与闭包关联

已知以下代码片段:function outer() { let a = 10; function inner() { console.log(a); } return inner; } let func = outer(); func(); 请详细解释这里作用域链的形成,以及闭包是如何依赖作用域链实现对外部变量访问的。
43.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 作用域链的形成
    • 全局作用域:代码开始执行时,首先进入全局作用域。全局作用域中有let func声明。
    • outer函数作用域:当调用outer函数时,创建outer函数作用域。在这个作用域中声明了变量a并赋值为10,同时声明了inner函数。outer函数作用域的外部作用域是全局作用域。
    • inner函数作用域inner函数在outer函数内部定义,inner函数作用域的外部作用域是outer函数作用域。
    • 作用域链是从当前执行的作用域开始,沿着嵌套的函数作用域向上,直到全局作用域形成的链条。所以这里的作用域链为:inner函数作用域 -> outer函数作用域 -> 全局作用域。
  2. 闭包依赖作用域链实现对外部变量的访问
    • 闭包形成outer函数返回了inner函数,并且inner函数在outer函数外部被调用(func()),这就形成了闭包。
    • 访问外部变量inner函数在访问变量a时,由于自身作用域中没有a,它会沿着作用域链向上查找。作用域链使得inner函数能够找到outer函数作用域中的a变量并访问其值。即使outer函数已经执行完毕,其作用域因为被inner函数(闭包)引用而不会被垃圾回收机制回收,从而保证了inner函数始终可以通过作用域链访问到outer函数作用域中的a变量。