JS中关于预编译的【关键知识点】总结
在JavaScript中,预编译(hoisting)是指在代码执行之前,JavaScript引擎会首先对代码进行扫描,将所有的变量声明和函数声明提升到代码的最顶部。这一过程使得我们在代码中可以在声明之前使用变量和函数。理解预编译对于深入理解JavaScript的执行机制至关重要。以下是预编译的几个关键知识点:
1. 变量声明提升
JavaScript会将变量声明(var
)提升到当前作用域的顶部,但是不会提升变量的赋值。
示例:
console.log(x); // 输出: undefined
var x = 5;
console.log(x); // 输出: 5
解释:
在预编译阶段,这段代码实际上变成了:
var x;
console.log(x); // 输出: undefined
x = 5;
console.log(x); // 输出: 5
因此,在第一次console.log
调用时,x
已经被声明但未赋值,因此输出undefined
。
2. 函数声明提升
函数声明会被整体提升到当前作用域的顶部,这意味着函数可以在声明之前被调用。
示例:
hoistedFunction(); // 输出: "This function has been hoisted!"function hoistedFunction() {console.log("This function has been hoisted!");
}
解释:
在预编译阶段,这段代码实际上变成了:
function hoistedFunction() {console.log("This function has been hoisted!");
}hoistedFunction(); // 输出: "This function has been hoisted!"
3. 函数表达式不提升
函数表达式不会被提升,因此在声明之前调用函数表达式会导致错误。
示例:
console.log(notHoisted); // 输出: undefined
notHoisted(); // 抛出TypeError: notHoisted is not a functionvar notHoisted = function() {console.log("This function is not hoisted.");
};
解释:
在预编译阶段,这段代码实际上变成了:
var notHoisted;
console.log(notHoisted); // 输出: undefined
notHoisted(); // 抛出TypeError: notHoisted is not a functionnotHoisted = function() {console.log("This function is not hoisted.");
};
由于notHoisted
在声明之前被调用,因此它的值是undefined
,无法作为函数调用。
4. let
和const
的特性
let
和const
声明的变量不会被提升到作用域顶部,但会在声明之前处于暂时性死区(Temporal Dead Zone,TDZ)。
示例:
console.log(a); // ReferenceError: Cannot access 'a' before initialization
let a = 3;console.log(b); // ReferenceError: Cannot access 'b' before initialization
const b = 5;
解释:
let
和const
的变量在声明之前无法被访问,尝试访问会导致ReferenceError
。这与var
的行为不同。
5. 预编译过程概述
在代码执行之前,JavaScript引擎会经历以下预编译步骤:
- 创建全局执行上下文(Global Execution Context)。
- 扫描代码,查找变量声明(
var
)、函数声明。 - 将变量声明提升到当前作用域顶部,并初始化为
undefined
。 - 将函数声明提升到当前作用域顶部,并将函数体赋值给对应标识符。
- 执行代码。
示例:
function example() {console.log(a); // 输出: undefinedvar a = 2;console.log(b); // 输出: function b() { console.log("This is function b"); }function b() {console.log("This is function b");}
}example();
解释:
在预编译阶段,这段代码实际上变成了:
function example() {var a;function b() {console.log("This is function b");}console.log(a); // 输出: undefineda = 2;console.log(b); // 输出: function b() { console.log("This is function b"); }
}example();
在预编译阶段,a
和b
已经被提升,a
初始化为undefined
,b
初始化为函数体。
结论
预编译是JavaScript执行过程中的一个重要机制,通过理解变量和函数的提升,我们可以更好地理解代码的执行顺序,避免意外的错误。特别是在涉及var
、let
、const
以及函数声明和表达式时,预编译机制显得尤为重要。
相关文章:
JS中关于预编译的【关键知识点】总结
在JavaScript中,预编译(hoisting)是指在代码执行之前,JavaScript引擎会首先对代码进行扫描,将所有的变量声明和函数声明提升到代码的最顶部。这一过程使得我们在代码中可以在声明之前使用变量和函数。理解预编译对于深…...
Elasticsearch 映射(mapping)
概念 在 Elasticsearch 中,映射(Mapping)定义了索引中字段的类型和属性。它是索引数据结构的基础,类似于传统数据库中的表结构定义。映射不仅定义了字段的类型(如 text、keyword、integer 等)…...
开放式耳机更适合运动的时候使用?开放式耳机推荐指南
开放式耳机确实非常适合运动时使用,原因主要有以下几点。 首先,保持对外界的感知是很重要的一点。在运动的时候,我们需要听到周围的环境声音,比如车辆的行驶声、行人的呼喊等,以便及时做出反应,保证自身安全…...
食堂窗口自助点餐小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,商家管理,店铺信息管理,菜品分类管理,菜品信息管理,订单管理,系统管理 微信端账号功能包括:系统首页&#…...
请说出路由传参和获取参数的三种方式
在Vue.js中使用Vue Router进行路由管理时,传递和获取参数是常见的需求。这里介绍三种主要的路由传参和获取参数的方式: 1. 通过URL的查询参数(Query Parameters) 传递参数: 当你需要传递一些非敏感数据(…...
精准防控,高效管理:AI智能分析网关V4区域未停留检测算法的介绍及应用
一、区域未停留AI检测算法概述 随着人工智能和计算机视觉技术的飞速发展,区域未停留AI检测算法作为一种重要的视频分析技术,逐渐在各个领域得到广泛应用。该算法通过高效处理视频流数据,能够实时分析并判断目标对象是否在预设区域内有足够的…...
html+css練習:iconfont使用
1.網址地址:https://www.iconfont.cn/search/index 2.註冊登錄,將需要的圖標添加到購物車 3.下載代碼 4.下載后的代碼有一個html頁面,裡面有詳細的使用方式...
算法导论 总结索引 | 第五部分 第二十一章:用于不相交集合的数据结构
一些应用涉及 将n个不同的元素分成一组不相交的集合。寻找包含给定元素的唯一集合 和 合并两个集合 1、不相交集合的操作 1、一个不相交集合 数据结构 维持了 一个不相交动态集的集合 S {S_1, S_2,…, S_n}。用一个代表 来标识每个集合,它是这个集合的某个成员。…...
【单例设计模式】揭秘单例模式:从原理到实战的全方位解析(开发者必读)
文章目录 深入理解单例设计模式:原理、实现与最佳实践引言第一部分:设计模式简介第二部分:单例模式定义第三部分:单例模式的优点和缺点第四部分:单例模式的实现方式懒汉式非线程安全的实现线程安全的实现(双…...
VTK8.2.0编译(Qt 5.14.2+VS2017)
VTK8.2.0编译(Qt 5.14.2VS2017) 关于Qt和MSVC的安装,可以参考文章(QtMSVC2017)。 本篇VTK在QtMSVC的配置下的编译。VTK 以8.2.0为例。 一、环境变量的配置 我们打开电脑的环境变量,可以看到没有Qt相关的…...
武汉流星汇聚:亚马逊跨境电商龙头,市场份额稳固,服务品质卓越
在全球跨境电商的版图上,亚马逊无疑是一颗璀璨的明星,以其庞大的市场规模、卓越的用户体验和强大的品牌影响力,稳居行业龙头地位。即便在诸多新兴跨境平台竞相崛起的背景下,亚马逊依然以其独特的优势,保持着难以撼动的…...
我出一道面试题,看看你能拿 3k 还是 30k!
大家好,我是程序员鱼皮。欢迎屏幕前的各位来到今天的模拟面试现场,接下来我会出一道经典的后端面试题,你只需要进行 4 个简单的选择,就能判断出来你的水平是新手(3k)、初级(10k)、中…...
opecv c++计算图像的曲率
公式 κ z x x ⋅ z y 2 − 2 ⋅ z x ⋅ z y ⋅ z x y z y y ⋅ z x 2 ( z x 2 z y 2 1 ) 3 / 2 \kappa \frac{z_{xx} \cdot z_y^2 - 2 \cdot z_x \cdot z_y \cdot z_{xy} z_{yy} \cdot z_x^2}{(z_x^2 z_y^2 1)^{3/2}}\newline κ(zx2zy21)3/2zxx⋅zy2−2⋅zx…...
鸿蒙 IM 即时通讯开发实践,融云 IM HarmonyOS NEXT 版
融云完成针对“纯血鸿蒙”操作系统的 SDK 研发,HarmonyOS NEXT 版融云 IM SDK 已上线,开发者可在“鸿蒙生态伙伴 SDK 市场”查询使用。 发挥 20 年通信行业技术积累和领创品牌效应,融云为社交、娱乐、游戏、电商、出行、医疗等各行业提供专业…...
【全国大学生电子设计竞赛】2022年D题
🥰🥰全国大学生电子设计大赛学习资料专栏已开启,限时免费,速速收藏~...
【优秀python案例】基于python爬虫的深圳房价数据分析与可视化实现
现如今,房价问题一直处于风口浪尖,房价的上涨抑或下跌都牵动着整个社会的利益,即便是政府出台各种政策方针也只能是暂时抑制楼市的涨势,对于需要买房的人来说,除了关注这些变化和政策外,还有一个非常头疼的…...
vscode安装与配置本地c/c++编译调试环境
目录 (1)安装vscode和常用插件 1.下载安装vscode 2.安装常用插件 (2)本地安装和配置编译器 1.安装编译器 2.vscode配置编译器 第1种:全局配置 第2种:为当前项目个性化配置 (3ÿ…...
PCIe学习笔记(15)
设备就绪状态 (Device Readiness Status,DRS)消息 (Device Readiness Status (DRS) 是PCIe规范中引入的一种机制,旨在改进设备初始化和就绪状态的检测与报告。 在以往的PCIe版本中,系统通常依赖于固定的超时机制来判断设备是否已…...
Rust中的特殊类型所占的内存大小
可以使用std::mem:size_of获取类型大小: use std::mem::size_of;struct Journal(String, u32); trait Summary {} impl Summary for Journal {}fn main() {println!("普通结构体相关:");println!("{}", size_of::<&Journal&…...
【深度学习】变分自编码器 VAE,什么是变分?(1)
文章目录 1. 变分自编码器 VAEVAE的基本概念VAE的数学原理编码器解码器目标函数训练过程代码示例未来发展2. 变分推断变分推断(Variational Inference)变分推断的基本概念变分推断的目标变分下界(Evidence Lower Bound, ELBO)最大化变分下界变分推断的步骤3. 必读内容1. 变…...
宏编程:C++宏、Rust宏和Lisp宏比较
根据simondobson两篇文章(1、2),总结比较一下C宏 Rust宏和Lisp宏: Rust 宏:Rust 有两种类型的宏: 声明性宏:这些模式匹配参数来生成代码。 过程宏:这些宏执行从代码到代码的更一般…...
ChatGPT协助撰写研究论文的11种方法【全集】
学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 当我们使用 ChatGPT 时,原本那些需要花费数小时、数天、有时甚至更长时间的任务现在只需几分钟甚至更短时间。 今天的分享,我们将谈谈 ChatGPT 在研究论文方面可…...
PEP 8 – Python 代码风格指南中文版(四)
何时使用尾随逗号 尾随逗号通常是可选的,但在创建一个只有一个元素的元组时是必须的。为了清晰起见,建议使用(技术上多余的)括号将其包围起来: # 正确的: FILES (setup.cfg,)# 错误的: FILES setup.cfg, 当尾随逗号…...
基于深度学习的适应硬件的神经网络
基于深度学习的适应硬件的神经网络设计旨在最大限度地利用特定硬件平台的计算和存储能力,提高模型的执行效率和性能。这些硬件包括图形处理单元(GPU)、张量处理单元(TPU)、现场可编程门阵列(FPGA࿰…...
上传音频文件
思路 1、自定义Upload 重点:<input ref{inputRef} type"file" accept{accept} onClick{e > e.stopPropagation()} onChange{uploadFile} multiple{multiple}/> 使用input标签设置type是file,将input元素通过forwardRef暴露给父组件&…...
Linux之jdk离线安装
下载地址 一、linux安装jdk8 1、上传,解压 cd /usr/local/java tar -zxvf jdk-10.0.2_linux-x64_bin.tar.gz2、修改配置 vim /etc/profile #在/etc/profile文件后面加上如下配置 export JAVA_HOME/usr/local/java/jdk-10.0.2 export JRE_HOME/usr/local/java/jd…...
JVM结构、架构与生命周期总结
【1】JVM结构 不同厂商的JVM产品 : 厂商JVMOracle-SUNHotspotOracleJRocketIBMJ9 JVM阿里Taobao JVM HotSpot VM是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构。 在今天,Java程序的运行性能早已脱胎换骨,已…...
Flink-StarRocks详解:第四部分StarRocks分区管理,数据压缩(第54天)
文章目录 前言2.3.3 管理分区2.3.3.1 增加分区2.3.3.2 删除分区2.3.3.3 恢复分区2.3.3.4 查看分区 2.3.4 设置分桶2.3.4.1 随机分桶(自 v3.1)2.3.4.2 哈希分桶2.3.4.2.1 优点2.3.4.2.2 如何选择分桶键2.3.4.2.3 注意事项 2.3.4.3 确定分桶数量 2.3.5 最佳…...
为什么有时候银行贷款审核会查大数据信用?
在申请银行贷款时,不少人会疑惑为何银行会深入审查申请人的大数据信用信息。这背后,其实是银行风险控制与精准决策的体现。 首先,大数据信用信用能全面反映申请人的信用状况 它不仅仅局限于传统的征信报告,还涵盖了消费行为、社交…...
LoRa无线通讯,让光伏机器人实现无“线”管理
光伏清洁机器人,作为光伏电站运维的新兴关键设备,已跃升为继组件、支架、光伏逆变器之后的第四大核心组件,正逐步成为光伏电站的标准配置。鉴于光伏电站普遍坐落于偏远无人区或地形复杂之地,光伏清洁机器人必须具备远程操控能力、…...
家装公司网站建设网站/百度识图在线入口
学习适配器有一段时间了,现在对BaseAdapter的优化和要是项目中用到的适配其很多的话,完全可以建立一个SimpleBaseAdapter(继承自BaseAdapter),方便扩展. 主布局代码: 1 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"2 xmlns:tool…...
做网站视频是什么专业/西安关键词优化服务
问两个trancation事务声明的方法t1和t2,这时候t1调用t2,t2起作用吗? 答:不起作用,对于t2来说事务失效 如何让其不失效? 答案:通过代理去调t2中的方法,原理和代理模式一样 (Servi…...
网站空间数据库需要多大/厦门网站搜索引擎优化
Trie 定义: Trie (字典树)是一种用于实现字符串快速检索的多叉树结构。Trie的每个节点都拥有若于个字符指针,若在插入或检索字符串时扫描到一个字符c, 就沿着当前节点的C字符指针,走向该指针指向的节点。 初始化 一棵空Trie仅包含一个根节点…...
专门做企业名录的网站/西安优化排名推广
原标题:Unity编辑器中使用GitHub管理项目Git作为代码协作工具已帮助了成千上万的开发者,但对于游戏开发来说还是稍有不便。最近GitHub官方推出了GitHub for Unity扩展工具,该工具对程序员及设计师均适用,Unity游戏开发者可以更好地…...
wish跨境电商平台/seopc流量排行榜企业
方法一 通常使用socket.gethostname()方法即可获取本机IP地址,但有时候获取不到(比如没有正确设置主机名称) import socket#获取计算机名称hostnamesocket.gethostname()#获取本机IPipsocket.gethostbyname(hostname)print(ip) 方法二&#x…...
如何为wordpress添加音乐播放器/大连网络推广
上周听了tt大神作分享,获益良多。之前一直不知道Windows的域是怎么回事,有点被点拨开悟了一些。趁现在还有记忆,把当时的记录回忆一下。活动目录,即Active Directory,是Windows服务器环境的一个核心服务,对…...