面试题答案
一键面试- 执行上下文变化:
- 调用
a()
时:- 创建
a
函数的执行上下文。a
函数的执行上下文包含变量环境(在这里声明了x
和func
)和词法环境。x
初始化为1
。
- 创建
- 调用
b()
时:- 创建
b
函数的执行上下文。b
函数的执行上下文包含变量环境(在这里声明了y
和c
)和词法环境。y
初始化为2
。
- 创建
- 调用
c()
时:- 创建
c
函数的执行上下文。c
函数的执行上下文包含变量环境(在这里声明了z
)和词法环境。z
初始化为3
。
- 创建
- 调用
- 作用域链动态调整过程:
a
函数执行上下文:- 其作用域链包含
a
函数自身的变量环境和全局执行上下文的变量环境(因为a
函数在全局环境中定义)。
- 其作用域链包含
b
函数执行上下文:- 其作用域链包含
b
函数自身的变量环境,然后是a
函数的变量环境,最后是全局执行上下文的变量环境。这是因为b
函数在a
函数内部定义,所以它的作用域链继承自a
函数。
- 其作用域链包含
c
函数执行上下文:- 其作用域链包含
c
函数自身的变量环境,然后是b
函数的变量环境,接着是a
函数的变量环境,最后是全局执行上下文的变量环境。因为c
函数在b
函数内部定义,它的作用域链继承自b
函数,进而继承了a
函数的作用域链。
- 其作用域链包含
- 最终输出结果及原因:
- 输出结果:
6
。 - 原因:当
c
函数执行console.log(x + y + z)
时,c
函数作用域链中,z
在c
函数自身变量环境中找到值为3
,y
在b
函数变量环境中找到值为2
,x
在a
函数变量环境中找到值为1
。所以x + y + z
的结果为1 + 2 + 3 = 6
。
- 输出结果: