MST

星途 面试题库

面试题:JavaScript执行上下文与作用域链复杂场景分析

以下代码存在多个函数嵌套和不同类型的作用域,请分析每次函数调用时执行上下文的变化、作用域链的动态调整过程,以及最终的输出结果,并说明原因。function a() { let x = 1; function b() { let y = 2; function c() { let z = 3; console.log(x + y + z); } return c; } let func = b(); func(); } a();
35.4万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

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