【JavaScript编程】预解析机制

news/2024/9/19 10:57:08/文章来源:https://www.cnblogs.com/o-O-oO/p/18420160
前言一、预解析是什么?二、预解析的过程三、预解析对代码执行的影响四、代码示例五、总结

原创 思跃喵 我码玄黄

前言

在 JavaScript 的世界里,代码的执行并不是简单地从上到下按顺序进行的。

在实际执行之前,JavaScript 引擎会进行一个特殊的阶段,称为“预解析”。

这一阶段对于理解 JavaScript 的行为至关重要。本文将详细解释预解析的概念、过程以及它如何影响代码的执行。

一、预解析是什么?

预解析是 JavaScript 代码在执行前的准备阶段。

在这个阶段,JavaScript 引擎会做以下几件事情:

创建词法环境:为即将执行的代码创建一个词法作用域。扫描变量和函数声明:查找所有的var声明的变量和function声明的函数,并将它们加入到当前的词法环境中。存储声明:将这些变量和函数的声明存储在内存中,但不会执行它们的赋值或函数体。

二、预解析的过程

预解析的过程可以概括为以下几个步骤:

扫描变量声明:找到所有的var声明,并将它们作为未初始化的变量加入到词法环境中。
扫描函数声明:找到所有的function声明,并将它们作为函数对象加入到词法环境中。
跳过赋值操作:在预解析阶段,等号右边的赋值操作不会被执行。

三、预解析对代码执行的影响

预解析对代码的执行有显著的影响。

以下是一些关键点:

变量提升:在预解析阶段,var声明的变量会被提升到它们所在作用域的顶部,但它们的赋值不会提升。函数提升:function声明的函数也会被提升到它们所在作用域的顶部,这意味着函数可以在声明之前被调用。变量和函数的重名问题:如果一个变量和函数同名,变量声明会被覆盖。

四、代码示例

让我们通过一些示例来更好地理解预解析是如何工作的。

var b = 123;
function b() {
}console.log(c);
var c = 1;
console.log(c);
function c() {console.log(2);
}

解析过程

预解析阶段:

var b;
function b() {}

执行阶段:


b = 123;console.log(c); // 输出undefined,因为c的声明在预解析阶段被提升,但赋值没有。var c; // 再次声明c,但此时c已经被提升为函数,所以变量声明被忽略。c = 1; // 将c的值设置为1。console.log(c); // 输出1,因为c现在是一个变量。

测试结果:

第一个console.log(c);输出undefined,因为c在预解析阶段被提升为函数,但赋值没有被提升。

第二个console.log(c);输出1,因为c已经被赋值为1。

五、总结

预解析是 JavaScript 中一个非常重要的机制,它影响着变量和函数的声明、提升以及作用域。

理解预解析有助于编写更清晰、更可预测的 JavaScript 代码。

记住,预解析只处理声明,不会执行赋值或函数体,这是理解 JavaScript 行为的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799749.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正也科技-辖区与指标管理系统 强化决策支持

正也科技的“辖区与指标管理系统”设计理念先进,旨在通过科学合理的组织架构和精细化的指标管理,帮助企业实现更高效的市场布局、人员配置及业绩监控。以下是对该系统核心功能的进一步阐述及其对企业运营带来的优势:正也科技辖区管理组织架构维护 灵活性与适应性:系统允许企…

Linux awk中输出上下两列值之间的差值

001、[sy20213040737@admin2 test]$ cat a.txt ## 测试数据 3 8 34 50 [sy20213040737@admin2 test]$ awk {if(NR == 1){tmp = $1} else {print $1 - tmp; tmp = $1}} a.txt ## 输出差值 5 26 16 。

对象字符串转换为数组对象

数据源格式:{\n "填写说明": "每个学期的开学之前,需要调整这里面的配置,这样课表和一卡通对接的才能是正确的数据",\n "学年编号": "2024-2025",\n "学期编号": "1"\n}"{"填写说明":…

2414.最长的字母序连续字符串的长度

字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串 "abcdefghijklmnopqrstuvwxyz" 的任意子字符串都是 字母序连续字符串 。 例如,"abc" 是一个字母序连续字符串,而 "acb" 和 "za" 不是。 给你一个仅由小写英文…

易优eyoucms网站后台登录一直显示验证码错误

当后台登录一直显示验证码错误时,可以尝试以下几个方面进行排查和解决: 1. 检查目录权限和所有者 确保目录权限和所有者设置正确,这对于文件的读写非常重要。 修改目录权限修改目录权限:将目录权限设置为755,文件权限设置为644。 使用命令chmod -R 755 /path/to/directory…

易优cms网站验证码不显示是什么情况

当您在使用易优CMS时遇到验证码不显示的问题,可能的原因有很多。以下是一些可能的情况及解决办法: 可能的情况及解决办法 1. CMS版本太低下载修复包:访问易优CMS的官方网站或修复包下载页面(如易优CMS日志),下载最新的修复包。 解压缩修复包,并将其中的文件上传覆盖到网…

Flink-cdc丢失数据排查

一、获取任务信息 任务id:i01f51582-d8be-4262-aefa-000000 任务名称:ods_test1234 丢失的数据时间:2024-09-16 09:28:47二、数据同步查看日志 1、筛选日志 筛选2024-09-16 09:28:47 到 5分钟后数据 2、查找快照id,筛选内容Committed snapshot 7258609197164498019 (BaseRo…

纷享销客“子流程”创新——企业流程管理的革新之选

Jack是一家电子商务企业的销售经理,近期他的公司订单量激增,但随之而来的退货流程却成了一个棘手的问题。每天,成百上千的退货请求涌向客服部门,而退货流程的每一步:从接收退货申请、物流派单、商品检验入库,到最终的财务退款,都至关重要,却也复杂繁琐。任何一步的延误…

易优cms网站错误提示{msg:u5199u5165u8868ey_ad_positionu8bb0u5f55u5931u8d25uff0cu8bf7u5c1du8bd5F5u5237u65b0!}

根据错误提示和处理步骤,我们可以按部就班地解决这个问题。以下是详细的步骤说明: 1. 准备SQL文件 首先,需要准备一个包含两条更新语句的SQL文件。 步骤一:创建SQL文件打开文本编辑器(如Notepad++、VSCode等)。将以下两条SQL语句复制并粘贴到文本编辑器中:UPDATE `ey_ad…

易优cms网站无法安装,数据库文件版本号(v1.3.5)与CMS源码版本号(v1.3.6)不一致,点击查看!

当您在安装易优CMS时遇到“数据库文件版本号与CMS源码版本号不一致”的问题时,通常是因为后台升级后没有备份数据库就进行了打包搬家。以下是一步步的解决方法: 解决步骤本地备份数据库 删除安装锁文件 重命名安装目录 清理运行时目录 打包并上传扫码添加技术【解决问题】专注…

GPUStack 0.2:开箱即用的分布式推理、CPU推理和调度策略

单机多卡分布式推理、跨主机分布式推理、CPU 推理、各种调度策略,你想要的全都有GPUStack 是一个专为运行大语言模型(LLM)设计的开源 GPU 集群管理器,旨在支持基于任何品牌的异构 GPU 构建统一管理的算力集群,无论这些 GPU 运行在 Apple Mac、Windows PC 还是 Linux 服务器…

易优cms网站安装报错,请仔细核对数据库账号和密码

当您在安装易优CMS时遇到“请仔细核对数据库账号和密码”的错误提示时,这通常意味着在安装过程中,CMS尝试连接数据库但失败了。以下是一些排查和解决此类问题的方法: 1. 核对数据库信息检查数据库地址:确保数据库地址正确无误。对于本地数据库,通常是localhost;对于远程数…