JS 入门通关手册(35):执行上下文、调用栈与作用域链深度解析
一、什么是执行上下文执行上下文Execution Context是 JS 代码运行时的环境JS 引擎会为每一段可执行代码创建一个上下文用来管理变量、作用域、this 指向等。简单理解一段代码在哪里跑、能访问什么、this 是谁都由执行上下文决定。JS 中有三种执行上下文全局执行上下文函数执行上下文eval 执行上下文极少使用可忽略二、执行上下文的生命周期一个执行上下文从创建到销毁分为两个阶段1. 创建阶段生成变量对象VO建立作用域链Scope Chain确定this 指向2. 执行阶段变量赋值函数执行代码逐行运行三、变量对象与活动对象1. 变量对象 VOVariable Object存储当前上下文中的变量声明函数声明函数形参2. 活动对象 AOActivation Object函数上下文被执行时变量对象会变成活动对象可以被访问。全局上下文没有 AO只有 VO。四、作用域链Scope Chain当代码访问一个变量时先在当前执行上下文的变量对象查找找不到 → 去父级执行上下文查找一直向上直到全局上下文都找不到 → 报ReferenceError这条查找路径就是作用域链。作用域链本质是当前上下文 AO 所有父级 VO 的链表。五、调用栈Call StackJS 是单线程代码执行顺序由调用栈管理。规则全局上下文先入栈永远在栈底调用函数时函数上下文入栈函数执行完毕上下文出栈最后全局上下文出栈程序结束示例jsfunction a() { function b() { console.log(b) } b() } a()调用栈顺序全局上下文入栈a 入栈b 入栈b 执行完出栈a 执行完出栈全局出栈六、作用域链与闭包的关系闭包之所以能访问外部函数变量就是因为内部函数的作用域链保留了外部函数的活动对象即使外部函数执行完毕出栈其 AO 依然被引用不会被销毁。这就是闭包的底层原理。七、执行上下文与 this 指向this 的绑定是在执行上下文创建阶段确定的全局上下文this → window普通函数调用this → window /undefined对象方法调用this → 调用对象new 调用this → 新实例call/apply/bindthis → 绑定对象箭头函数this 继承外层上下文八、高频面试题什么是执行上下文答JS 代码运行时的环境管理变量、作用域链、this。作用域链的作用是什么答按层级查找变量保证变量访问的有序性。调用栈溢出是什么原因答递归无出口函数无限入栈超过栈最大长度。闭包和作用域链的关系答闭包依靠作用域链保留外部函数 AO实现变量持久化。变量提升发生在哪个阶段答执行上下文创建阶段。九、总结执行上下文是 JS 代码运行的基础环境分为创建阶段VO、作用域链、this和执行阶段作用域链是变量查找的层级链路调用栈控制函数执行顺序闭包、this、变量提升都依赖执行上下文机制理解执行上下文才算真正懂 JS 运行机制
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2475924.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!