如何理解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/constuninitialized状态;
    • 创建变量环境(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)  如何在阿里云服务器自主搭建网站?  手机软键盘弹出时影响布局的解决方法  如何获取免费开源的自助建站系统源码?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?