面试题答案
一键面试-
函数作用域链
outer
函数:outer
函数创建了自己的作用域。在这个作用域中,定义了变量a
并赋值为1
。- 当
outer
函数执行时,它的作用域链首先包含自身的作用域,其中有变量a
。
middle
函数:middle
函数定义在outer
函数内部,它的作用域链由两部分组成。- 首先是
middle
函数自身的作用域,其中定义了变量b
并赋值为2
。 - 然后是它的外部作用域,也就是
outer
函数的作用域。所以middle
函数可以访问outer
函数作用域中的变量a
。
inner
函数:inner
函数定义在middle
函数内部,它的作用域链由三部分组成。- 首先是
inner
函数自身的作用域(在这个例子中,它没有定义新的变量)。 - 然后是它的直接外部作用域,即
middle
函数的作用域,在这里可以访问变量b
。 - 最后是
middle
函数的外部作用域,也就是outer
函数的作用域,在这里可以访问变量a
。
-
闭包的工作原理
- 闭包是指一个函数能够访问并记住其词法作用域,即使该函数在其原始作用域之外被调用。
- 在这段代码中,
inner
函数形成了闭包。当inner
函数被返回并在outer
函数外部调用时,它仍然能够访问outer
函数作用域中的a
和middle
函数作用域中的b
。 - 这是因为
inner
函数在创建时,它的作用域链被固定下来,包含了middle
函数和outer
函数的作用域。即使outer
和middle
函数已经执行完毕,它们的作用域因为被inner
函数引用(闭包)而不会被垃圾回收机制回收。
-
每次函数调用时作用域的变化
outer
函数调用:- 当
outer
函数被调用时,outer
函数的作用域被创建,变量a
被初始化。此时作用域链只有outer
函数自身的作用域。 outer
函数返回middle
函数,outer
函数执行完毕,但由于middle
函数对outer
函数作用域的引用(通过闭包),outer
函数的作用域不会被销毁。
- 当
middle
函数调用:- 当
middle
函数被调用(通过outer()()
),middle
函数的作用域被创建,变量b
被初始化。 middle
函数的作用域链包含自身作用域和outer
函数的作用域。middle
函数返回inner
函数,middle
函数执行完毕,但由于inner
函数对middle
函数作用域的引用(通过闭包),middle
函数的作用域不会被销毁。
- 当
inner
函数调用:- 当
inner
函数被调用,inner
函数的作用域被创建。 inner
函数的作用域链包含自身作用域、middle
函数的作用域和outer
函数的作用域。inner
函数执行return a + b
,从作用域链中找到a
和b
,计算并返回结果3
。inner
函数执行完毕,由于没有其他地方引用inner
函数,inner
函数自身的作用域被销毁,但middle
和outer
函数的作用域因为闭包的存在仍然保留。
- 当