JS上下文和作用域链
开发中我们可能会不小心将写多个相同名称的变量,也经常会写一个递归调用的方法,
上述示例中程序执行顺序如下图,程序会按照顺序执行第一个子元素内部所有的程序,当最底层执行结束后,会逐渐抛出返回值,然后执行第二个子元素的程序
要解释清楚上述原因,除了JS的单线程顺序执行外,还需要了解什么是上下文和作用域链
上下文又分为
- 全局上下文:最基础、最外层的一个上下文,变量不存在与任何一个函数或者{}内,this对应的是window对象
- 函数上下文:每次执行函数时,都会生成一个函数上下文,函数内定义的变量只可以被函数内部被访问,同一个函数执行多次,每次都会创建新的函数上下文
- 块级上下文:{}内部执行时生成的一个上下文,比如在for if 语句中通过let 和const创建的变量以及方法等,同样只能被{}内部访问
作用域链:每次生成上下文都会生成一个作用域链,如果变量在当前上下文访问不到,则会根据作用域链向上寻找,直至全局上下文。
上列详细的步骤为:
1. 生成全局上下文压入到栈中,同时生成一个作用域链
2. 执行到1-0时,生成上下文同样压入到栈中,生成作用域链,同时将该链与父级作用域链进行关联
3. 执行到1-0-0结束后,则会顺序执行下一个循环到1-0-1,都结束后会将控制器弹出到父级上下文,同时将1-0-0、1-0-1的变量释放以供垃圾回收
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义