如何理解JavaScript执行上下文_执行上下文怎样影响代码运行
发布时间 - 2025-12-27 00:00:00 点击率:次JavaScript执行上下文是代码运行的环境容器,决定变量、函数、this的查找与求值;分全局、函数、eval三种类型,生命周期含创建(处理声明与this)和执行(赋值与运算)两阶段,由执行上下文栈调度。
JavaScript执行上下文(Execution Context)是代码运行时的“环境容器”,它决定了变量、函数、this等如何被查找和求值。理解它,就等于看懂了JS代码“从哪开始执行、变量在哪能用、为什么有些变量还没定义就能调用”这些关键问题的底层逻辑。
执行上下文的类型和创建时机
JS中主要有三种执行上下文:
-
全局执行上下文:脚本启动时自动创建,一个JS文件(或模块)对应一个。它确定了全局对象(浏览器中是
window)、this指向、以及最外层的变量和函数声明。 -
函数执行上下文:每次函数被调用时创建,独立于调用位置。每个调用都有自己的上下文,保存该次调用的参数、局部变量、作用域链和
this值。 -
Eval执行上下文(已不推荐使用):在
eval()中执行字符串代码时创建,行为类似函数上下文但有安全与性能风险,现代开发中基本不用。
执行上下文的生命周期:创建阶段 vs 执行阶段
每个上下文分两步构建,这个过程直接影响你看到的“变量提升”现象:
-
创建阶段(进入上下文时立即发生):
• 创建词法环境(Lexical Environment),初始化let/const为uninitialized状态;
• 创建变量环境(Variable Environment),将var声明设为undefined,函数声明直接赋值为函数体;
• 确定this值(全局中是全局对象,普通函数调用中也是全局对象,箭头函数则继承外层this)。 -
执行阶段(按代码顺序逐行执行):
• 为var赋实际值;
• 对let/const执行赋值(若在声明前访问,会报ReferenceError,即暂时性死区TDZ);
• 执行函数调用、表达式计算等。
执行上下文栈(Call Stack)如何调度代码
JS是单线程的,靠执行上下文栈管理当前正在运行和待运行的上下文:
- 全局上下文最先入栈;
- 每次函数调用,新函数
上下文被压入栈顶; - 函数返回后,其上下文被弹出,控制权交还给栈下一个上下文;
- 栈为空时,JS引擎空闲等待新任务(如事件、定时器)。
例如:foo()调用bar(),再调用baz(),栈从底到顶就是:[全局 → foo → bar → baz]。任一函数出错,错误堆栈正是这个顺序的反向体现。
执行上下文怎样影响日常编码
很多常见行为都由上下文机制决定:
-
变量提升只对
var和函数声明生效:因为它们在创建阶段就被处理;let/const虽也进入词法环境,但处于TDZ,不能访问。 - 闭包的本质是词法环境的保留:内层函数执行完毕后,若其词法环境仍被外层引用(比如返回了内部函数),该环境不会被销毁,其中的变量持续可用。
-
this不是由函数定义位置决定,而是由调用方式决定:因为this是在函数上下文创建阶段绑定的,取决于谁调用、怎么调用(obj.fn()、fn.call(obj)、箭头函数等规则不同)。 - 立即执行函数(IIFE)能隔离变量,本质是制造独立的函数执行上下文,避免污染全局。
# javascript
# java
# js
# 编码
# 浏览器
# 栈
# win
# 作用域
# 为什么
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
网站页面设计需要考虑到这些问题
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel中的Facade(门面)到底是什么原理
详解Android图表 MPAndroidChart折线图
香港网站服务器数量如何影响SEO优化效果?
Laravel如何实现API资源集合?(Resource Collection教程)
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
如何用PHP工具快速搭建高效网站?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
如何用免费手机建站系统零基础打造专业网站?
Java遍历集合的三种方式
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
如何在VPS电脑上快速搭建网站?
php结合redis实现高并发下的抢购、秒杀功能的实例
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
JS去除重复并统计数量的实现方法
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
如何用狗爹虚拟主机快速搭建网站?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
如何在香港服务器上快速搭建免备案网站?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
如何续费美橙建站之星域名及服务?
如何安全更换建站之星模板并保留数据?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
浅谈Javascript中的Label语句
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
如何用虚拟主机快速搭建网站?详细步骤解析
动图在线制作网站有哪些,滑动动图图集怎么做?
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何快速搭建自助建站会员专属系统?
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
EditPlus中的正则表达式实战(5)
如何在阿里云服务器自主搭建网站?
手机软键盘弹出时影响布局的解决方法
如何获取免费开源的自助建站系统源码?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?


上下文被压入栈顶;