JavaScript 变量提升和函数提升

内衣行业数字化转型:ERP系统如何助力企业破局 在消费升级背景下,内衣行业正经历从传统制造向数字化运营的转型。ERP系统作为企业资源计划的核心工具,通过整合供应链管理、生产执行和零售分析等模块,实现数据驱动的精准决策。其技术价值在于打通信息孤岛,提升从产品开发到库存周转的全链路效率。在应用场景上,特别适合解决传统企业面临的生产反应滞后、库存积压和消费者洞察缺失等痛点。以华遨ERP为例,其智能预测和柔性供应链功能已帮助客户将新品开发周期缩短60%,库存周转天数控制在90天以内。这些实践表明,数字化转型不仅是技术升级,更是企业运营模式的重构。 阅读详情
前言

When we learn a new technology,we need to know what it is,why we learn it and how to use it best

今天在写代码的时候,突然发现了一个非常有意思的现象

其实就是两行代码

console.log(a);
var a = 1;

当将这两段代码运行在浏览器中时,会发现浏览器会报打印undefined,但是当我注释掉第二行后,浏览器就报错,提示a未定义
正常情况

注释第二行代码

按照我们正常的逻辑来思考,无论有没有”var a = 1“这段代码,浏览器都应该报错“a is not defined”。然而事实却不是这样的。那么为什么会这样,这其中就涉及到了JavaScript中的一个概念:变量提升

什么是变量提升

引擎在读取js代码的过程中,其实是分为两步:

1. 整个js代码的解析读取
2. 第二个步骤是执行

在js代码执行之前,浏览器的解析器在遇到var变量名和function整个函数时,变量名和函数会被提升到当前作用域的最前面。其中变量被提升到作用域的最前面的就叫做变量提升,而函数被提升到作用域的最前面的就叫做函数提升。函数提升和变量提升还是有一些区别的,在这里先好好说一下变量提升。

首先,我们要清楚两个概念,变量的声明和初始化。

变量的声明:就是定义变量,但不赋值,例如var a,就是对变量a的定义

变量的赋值:就是给变量赋值,例如 a =1。就是给变量a赋值1

而var a =1 就包括了两步:变量的定义和赋值。

ok,说完了,接下来就是思考刚刚之前的代码。为什么浏览器会打印undefined而不是打印1或者报错。

首先,浏览器在解析js代码时,会把var 变量的作用域提升到作用域的最前面,这就是变量提升。但是要记住,变量提升只会提升变量名的声明,而不会提升变量的赋值初始化。OK,这样我们就可以分析出为什么会出现这种情况

  1. 浏览器在开始解析那两段js代码时,遇见了var a = 1的代码,引擎会把变量a的作用域提升到最前面,但是不会提升变量的初始化赋值。
  2. 然后在运行这段js代码时,遇见了"console.log(a)"的代码,发现变量a已经有定义,但是还没有被赋值,因此输出undefined的值
  3. 这样就清楚了为什么会出现上述情况。
什么是函数提升

刚刚前面除了讲到了变量提升,还讲到了函数提升,什么是函数提升?

函数提升其实跟变量提升差不多,当引擎在解析js代码时,发现有函数变量的定义,就会先把这函数变量的作用域提升到整个作用域的最前面,但是函数提升是大于变量提升的

console.log(a); 

var a=1;

function a(){
    console.log(a);
}

运行结果

在这里插入图片描述

我们发现最终打印的是函数a的定义。函数提升的优先级大于变量提升的优先级,即函数提升在变量提升之上

其实只要理解下面两句话就可以掌握变量提升函数提升

  1. 变量提升只会提升变量名的声明,而不会提升变量的赋值初始化
  2. 函数提升的优先级大于变量提升的优先级,即函数提升在变量提升之上

来自这篇博客的总结:为啥要进行变量提升和函数提升

最后

其实,浏览器对于js代码的操作流程(主要是跟浏览器的js引擎有关)是造成出现变量提升和函数提升的最主要原因

浏览器对于js代码的处理,其实可以分为两步

  1. 解析(纵览js代码,做一些预处理,例如变量提升,函数提升,为了方便第二步的执行操作)
  2. 执行(从js代码第一行开始执行,一步一步执行)

或许不同浏览器的js引擎对于js代码的处理流程有可能有一些区别,但最多就是一些细节差别。或许我们有可能发现在chrome浏览器会出现变量提升,但是在其他浏览器就不会出现变量提升(我没测试过,我无法保证)

最后,附赠一张常见的各个主流浏览器的js引擎和渲染引擎
在这里插入图片描述

GD32模拟IIC读写DVC1124 GD32模拟IIC读写集澈AFE芯片DVC1124 阅读详情

相关推荐

RK3566/RK3588 NPU性能实测:用mobilenet模型快速验证你的开发板NPU是否正常工作

本文提供了RK3566/RK3588开发板NPU性能实测指南,通过MobileNet模型快速验证NPU是否正常工作。详细介绍了环境搭建、测试资源获取、编译运行及结果分析的全流程,帮助开发者高效验证神经网络加速器功能,为后续AI应用部署奠定基础。

weixin_28826521的博客 449

深入理解js的变量提升和函数提升

一、变量提升  在ES6中提出了块级作用域,用var声明的变量,起作用域应为对整个块都起作用,所以会跑偏;而且使用var声明的变量会出现“变量提升”现象。 那么什么是变量提升呢?用以下代码直观感受一下: 其执行顺序应为: 二、函数提升   js中创建函数有两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提升!如:

wu_dada的博客 1147

告别OLE!Delphi操作Excel的3种轻量级方案横向评测(FlexCel/XLSReadWriteII/LibXL)

本文深入评测了Delphi操作Excel的三种轻量级方案:FlexCel、XLSReadWriteII和LibXL。通过技术架构、API设计、性能测试和实战案例的全面对比,帮助开发者选择最适合的工具,提升Excel文件处理效率,告别传统OLE方案的依赖和性能问题。

onion的博客 930

11. 变量提升 && 执行上下文

/* 变量升级 预处理 */ /* js引擎在代码正式执行之前会做一个预处理的工作: 1.收集变量 2.收集函数 依据: var 将var后边的变量定义但不赋值 var username=undefined; function(){} */ console.log...

Melody5271的博客 544

LPC546xx USB接口VBUS阈值设计:从原理到实践,解决冷启动与可靠性问题

在嵌入式USB接口设计中,VBUS信号不仅是电源线,更是设备连接检测与电源管理的核心。其电压阈值直接决定了USB物理层(PHY)能否正确识别主机并建立有效会话。理解VBUS的会话有效电压(Votg_sess_valid)与PHY有效电压(VBUS_valid)等关键参数,是确保接口稳定性的基础。这些参数影响着设备枚举的成功率、通信稳定性以及长期可靠性。在工程实践中,尤其是对于集成PHY的微控制器如NPC LPC546xx系列,VBUS的连接方案(直接连接或通过稳压器)需要根据设备供电模式(自供电/总线供电)

weixin_30915275的博客 401

第一届“龙信杯”电子数据取证竞赛Writeup

第一届“龙信杯”电子数据取证竞赛Writeup

toto的博客 1万+

【js】JavaScript的变量提升、函数声明提升

JavaScript中的变量提升(Hoisting)是指在代码执行前,变量和函数的声明会被提升到当前作用域的顶部。对于var声明的变量,只有声明会被提升,赋值不会,因此访问未赋值的变量会返回undefined。函数声明会被整体提升,而函数表达式则不会。let和const虽然也会被提升,但在初始化前访问会触发暂时性死区(TDZ),导致报错。建议在新项目中使用let和const,避免使用var,并将变量声明放在使用之前,以提高代码的清晰度和可维护性。函数提升是JavaScript特有的行为,其他语言如Pytho

m0_56800366的博客 1167

在Ubuntu 20.04上,用EtherCAT Igh 1.6.2驱动高创BD3E伺服电机(附完整C代码)

本文详细介绍了在Ubuntu 20.04实时内核环境下,使用EtherCAT Igh 1.6.2主站驱动高创BD3E伺服电机的完整实现方案。从实时系统配置、伺服电机PDO映射到精确控制线程设计,提供了完整的C代码样例和实际项目中的调试技巧,帮助开发者实现工业自动化中的高精度运动控制。

weixin_30772105的博客 111

javascript/js变量提升和函数提升

javascript引擎的工作模式是“先解析后执行”,先解析申明的变量/函数,然后再一行一行执行代码。这造成的结果,就是所有变量/函数的声明语句,都会被提升到代码的头部,这就叫做变量/函数提升(hoisting) javascript执行分两个阶段:解析阶段(解析变量申明、解析函数申明、解析形参)、执行阶段 变量提升: 示例1: var a; console.log(a);//undefined a=2; 解析阶段:解析找到var关键字定义的变量,创建一个变量a的内存,给未赋值的变量一个默认值undefi

Tumbler_A的博客 345

23、管状剪纸结构的研究与功能生成连杆机构的综合设计

本文研究了管状剪纸结构的压缩运动特性,通过剪纸技术将非刚性可折叠的Yoshimura和Kresling折纸结构转化为刚性可折叠结构,并提出径向可闭合剪纸(RC-kiri)构型。推导了位移与折叠角之间的数学关系,设计了带外部LET接头的RC-kiri模型,建立了力-位移理论模型并通过Abaqus进行有限元验证,制作了3D打印物理模型以测量直径变化。同时,研究了四杆和六杆功能生成连杆机构的综合设计方法,基于负闭合运动链和最小二乘法实现函数生成。结果表明理论、仿真与实验整体吻合良好,误差来源得到分析,为机器人、机

nokia的博客 167

conda upgrade出现Solving environment:failed CondaValueError Malformed version string invalid chars解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对使用conda的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二

weixin_43178406的博客 8万+

JavaScript中的变量提升和函数提升

变量的作用域   在理解变量提升和函数提升之前,我们需要先理解好JavaScript的作用域的奇特之处。 没有块级作用域   和C、C++、以及Java不同,在ES6之前,JavaScript没有块级作用域,只有全局作用域和函数作用域。 注:其实从 ES3 发布以来,JavaScript 就有了块级作用域(with 和 catch分句),而 ES6 引入了 let 我们首...

zwkkkk1的博客 6296

YOLOv11涨点改进 | 检测头Head改进篇 | 利用DynamicConv高效动态卷积改进YOLOv11检测头,DyHead通过增强检测头操作,轻量化改进、提高模型目标检测的精度

本文提出了一种基于动态卷积(DynamicConv)的YOLOv11检测头改进方法v11Detect_DyHead。该方法通过引入多专家机制和动态权重调整,在增加参数量的同时保持较低计算复杂度,有效解决了低FLOPs模型难以从大规模预训练中获益的问题。文章详细介绍了DynamicConv模块的原理和实现,包括其参数高效特性、多专家机制和动态权重生成方式。同时提供了完整的代码实现和添加该模块的具体步骤,并给出了相应的YAML配置文件。实验表明,该方法在保持较低计算开销的同时显著提升了模型性能,适用于视觉和语言

Ai缝合怪、助力小伙伴高效发论文 536

JavaScript进阶:变量提升、函数提升、js解析机制

对变量提升、函数提升和js解析机制的理解。什么是变量提升呢,如果不能很好的理解变量提升,程序就容易出现一些问题。理解变量提升,也可帮助我们很好的弄懂js的解析机制。 1.什么是变量提升? 变量提升定义 变量提升就是将变量声明提升到它所在作用域的最开始的部分。 变量提升的理解 理解一:该变量不管是在作用域的哪个地方声明的,都会提升到作作用域的最顶上去。 理解二:变量可以先使用再声明。 ...

tomorrownan的博客 776

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

js 变量提升和函数提升

变量提升和函数提升

m0_65456170的博客 657

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JavaScript-变量预解析,变量的提升,函数的提升,同级作用域下同名的变量与函数的提升问题

预解析 JavaScript 代码在浏览器中是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程 预解析过程: 在当前的作用域下,JS 代码执行之前把通过 var 定义的变量和通过 function 声明的函数在内存中进行提前声明或者定义。 代码执行过程: 至上而下执行 JavaScript 代...

weixin_44486539的博客 581

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JavaScript 变量提升和函数提升详解

在 JavaScript 编程中,变量提升和函数提升是两个重要的概念,理解它们的工作原理对于编写正确、高效的代码至关重要。变量提升是 JavaScript 中一种独特的现象,它允许在变量声明之前即被访问,但这种情况仅存在于使用。:实际开发中推荐先声明再访问变量,这样可以提高代码的可读性和可维护性,避免因变量提升导致的意外行为。函数在声明之前被调用,这是因为函数提升将函数声明提升到了作用域的顶部。函数提升与变量提升比较类似,是指函数在声明之前即可被调用。这是因为变量提升只提升声明,不提升赋值。

奋斗的小前端 744

【Javascript】理解JS中变量及函数作用域的提升

【Javascript】理解JS中变量及函数作用域的提升

代码说,代码让世界更美好。 520

js--函数提升和变量提升

一:函数提升 console.log(global); // undefined var global = 'global'; console.log(global); // global function fn () {   console.log(a); // undefined   var a = 'aaa';   console.log(a); // aa...

dingbin1973的博客 182

JS变量提升和函数提升的顺序

今天笔试时碰到考察变量提升与函数提升顺序的一道题目,之前只知道var定义的变量会有变量提升以及函数声明也会提升,但没有深入研究他们的顺序以及详细过程。事后查阅资料加上自己的验证,得出了自己对于它们顺序的一些理解,如有不对的地方,欢迎大家指正。 首先给出我的结论:在作用域中,不管是变量还是函数,都会提升到作用域最开始的位置,不同的是,函数的提升后的位置是在变量提升后的位置之后的。 大家可以看下面这段代码: console.log(a) // ƒ a(){} var a=1; fu

代码使人头秃 3008

【JavaScript】变量提升与函数提升详解

在 JavaScript 中,变量提升和函数提升是指在代码执行之前,变量和函数的声明会被“提升”到它们所在作用域的顶端。这意味着即使在变量或函数被定义之前就已经使用它们,JavaScript 也不会报错。理解这个机制有助于开发者避免意想不到的行为,写出更加可靠的代码。变量提升是指在代码执行阶段,变量声明(不包括赋值)会被提升到其作用域的最顶端。在提升之后,变量在其作用域内的任何地方都可以访问到,但如果变量在提升后的初始赋值之前使用,它的值会是undefined。// 输出:undefined。

lph159的博客 1973

JS中的变量提升和函数提升

JS中函数和变量的提升及其比较

qq_51130780的博客 1474

js中函数和变量的提升

js中函数和变量的提升 内容:js在执行前会先进行预编译,在预编译中会对js代码进行函数和变量的提升。 1.我们可以在还没有定义变量的时候,使用变量。 console.log(a); var a = 1; 输出: undefined 提升之后的代码: var a; console.log(a); a = 1; 2.函数声明也可以提升,但是函数表达式不能提升。 2.1函数声明 console.l...

weixin_42881046的博客 139

【JavaScript】变量提升和函数提升

JS解析时,会先找到代码中,变量提升只会提升其中的变量声明,而不会提升其赋值操作。变量提升的特点:​​​变量提升的主要目的是,因为 JavaScript 是一种解释执行的语言,它在执行代码之前会进行解析和编译。通过变量提升,JavaScript 引擎可以提前知道哪些变量和函数在作用域中可用,从而避免了在执行过程中出现未定义的情况。变量提升可以使函数之间相互调用。

Cherryyyyyyyyyy的博客 1036

变量以及函数提升【JS】

 在了解这个知识点之前,我们先来看看下面的代码,控制台都会输出什么 1 2 3 4 5 6 7 8 varfoo = 1; functionbar() { if(!foo) { varfoo = 10; } alert(foo); } bar();   小白理解:foo是一个全局变量,值为1,当执行bar函...

weixin_49473712的博客 246

【JavaScript】Js预解析 变量提升 & 函数提升问题

JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript代码的时候分为两步:预解析 、 代码执行。:Js 解释器会把JavaScript里面所有的var还有function提升到当前作用域的最前面。

day day up 326
上一篇: vue源码学习
下一篇: JavaScript 同步和异步
Re_Code
博客等级 码龄9年 2粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值