js变量提升详解

JavaScript中的变量提升及其陷阱和规避方法 习惯上,我们会把var x = 123;看作一个声明,同时给变量赋值,但实际上编译器会将它编译成两个部分,一个是变量声明(var x;),另一个是变量赋值(x = 123;所有的变量声明包括函数声明都会在编译阶段被编译器提升到其作用域的顶部(函数作用域和全局作用域)。这意味着,无论变量的声明出现在作用域的什么地方,都会在代码被执行前优先处理,即无论在何处声明何处使用,使用时其变量都已经被声明了,在赋值前其值时undefined。 阅读详情

js变量提升

对于大多数js开发者来说,变量提升可以说是一个非常常见的问题,但是可能很多人对其不是特别的了解。所以在此,我想来讲一讲。

先从一个简单的例子来入门:

a = 2;
var a;

console.log(a);

你觉得以上的代码会输出什么?是输出undefined吗?如果是按照程序的自上而下执行的话,那么这一段代码确实是输出undefined。然而,javascript并不是严格的自上而下执行的语言。

这一段代码的输出结果是2,是不是感到很意外?为什么会这样呢?这个问题的关键就在于变量提升(hoisting)。它会将当前作用域的所有变量的声明提升到程序的顶部,因此上面的代码其实等价于以下代码。这样是不是就很简单明了了。

var a;
a = 2;

console.log(a);

那么接下来,我们再来看这个例子。

console.log(a);

var a = 2;

你觉得以上的代码会输出什么?是直接报ReferenceError吗?还是输出2呢?

其实以上代码会输出undefined。为什么呢?我们之前说过,js会将变量的声明提升到顶部,可是赋值语句并不会提升。对于js来说,其实var a = 2是分为两步的:

  1. var a;
  2. a = 2;

而js只会将第一步提升到顶部,所以上面的语句等价于:

var a;

console.log(a);

a = 2;

为什么有变量提升

那么为什么会出现变量提升这个现象呢?

js和其他语言一样,都要经历编译和执行阶段。而js在编译阶段的时候,会搜集所有的变量声明并且提前声明变量,而其他的语句都不会改变他们的顺序,因此,在编译阶段的时候,第一步就已经执行了,而第二步则是在执行阶段执行到该语句的时候才执行。

变量声明

js的变量声明其实大体上可以分为三种:var声明、let与const声明和函数声明。

函数声明与其他声明一起出现的时候,就可能会引起一些困扰。我们来看下面的例子。

foo();

function foo() {
    console.log('foo');
}
var foo = 2;

你觉得上面会输出什么?TypeError吗?其实输出的结果是foo。这就引出了我们的问题了,当函数声明与其他声明一起出现的时候,是以谁为准呢?答案就是,函数声明高于一切,毕竟函数是js的第一公民。

那么,下面的例子呢?

foo();

function foo() {
    console.log('1');
}

function foo() {
    console.log('2');
}

当出现多个函数声明,那怎么办呢?以上代码输出结果为2。因为有多个函数声明的时候,是由最后面的函数声明来替代前面的。

想必经历了以上的例子,你应该已经对变量声明已经有一定的了解了。那么我再来出一道题目来测试下。

foo();

var foo = function() {
    console.log('foo');
}

这道题目是不是非常简单啊?这道题和上面的第二道例子其实是一样的。var foo = function() {}这种格式我们叫做函数表达式。

它其实也是分为两部分,一部分是var foo,而一部分是foo = function() {},参照例2,我们可以知道,这道题的结果应该是报了TypeError(因为foo声明但未赋值,因此foo是undefined)。

上面我们提到了var声明,函数声明,那么接下来我们来讲讲let和const声明呢。这个我之前写过一边文章,大家可以点击这里去查看下。

总结

那么接下来我们来总结一下。

  1. js会将变量的声明提升到js顶部执行,因此对于这种语句:var a = 2;其实上js会将其分为var a;和a = 2;两部分,并且将var a这一步提升到顶部执行。
  2. 变量提升的本质其实是由于js引擎在编译的时候,就将所有的变量声明了,因此在执行的时候,所有的变量都已经完成声明。
  3. 当有多个同名变量声明的时候,函数声明会覆盖其他的声明。如果有多个函数声明,则是由最后的一个函数声明覆盖之前所有的声明。
Python之achatbot包语法、参数和实际应用案例 本书是一本PyTorch深度学习实战指南,分为基础(前6章)和进阶(后5章)两大部分。基础部分涵盖张量运算、神经网络、数据预处理及CNN等核心内容;进阶部分则深入图像、文本、音频建模技术,重点解析Transformer架构及大语言模型开发。全书采用"理论+实践"模式,适合从零基础到进阶的PyTorch学习者。 阅读详情

相关推荐

Verilator+VSCode实战:5分钟搞定Verilog语法检查与波形调试

本文详细介绍了如何将Verilator仿真器与VSCode编辑器高效集成,打造极速的Verilog开发工作流。通过环境配置、实时语法检查、一键仿真与波形生成等实战技巧,帮助IC设计工程师在几分钟内完成从代码编写到波形调试的全过程,大幅提升中小规模模块的验证效率。

weixin_28454475的博客 469

javascript变量提升详解

js变量提升 对于大多数js开发者来说,变量提升可以说是一个非常常见的问题,但是可能很多人对其不是特别的了解。所以在此,我想来讲一讲。 先从一个简单的例子来入门: a = 2; var a; console.log(a); 你觉得以上的代码会输出什么?是输出undefined吗?如果是按照程序的自上而下执行的话,那么这一段代码确实是输出undefined。然而,javascript并不是严格的自...

weixin_30270889的博客 731

Buck电路中自举电容串联小电阻的作用

在Buck电路中,自举电容(Cboot)驱动高边MOSFET时,因寄生电感和电容会形成LC谐振回路,导致SW节点高频振铃,引发EMI问题。串联小电阻(Rboot)可引入阻尼效应,抑制振铃、改善波形和EMI性能,但会略微增加开关损耗。设计时建议预留可调电阻位(2Ω~20Ω),根据实测结果平衡效率与系统稳定性,提升电源可靠性。这一措施是优化开关电源EMC的常见实践。

硬核科技 625

变量提升和暂时性死区

变量提升 var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。 为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。 // var 的情况 console.log(foo); // 输出undefined var foo = 2; // let 的情况 console.log(bar); // 报错ReferenceError let bar = 2; 上面

m0_46404694的博客 851

Selenium ChromeDriver反爬与性能优化实战指南

ChromeDriver作为Selenium的核心驱动,本质是浏览器自动化执行引擎,其默认行为会暴露大量JS运行时指纹(如navigator.webdriver、window.chrome),极易被前端反爬系统识别;同时因进程管理粗放、渲染等待机制僵化,导致内存泄漏、僵尸进程和高并发下稳定性崩塌。本文围绕真实生产场景,系统解析浏览器指纹伪造原理、进程级资源管控策略、基于页面状态的智能等待范式,并提供Docker容器化、K8s弹性扩缩与Prometheus可观测性落地路径,助力开发者将ChromeDriver

weixin_29762151的博客 1259

MATLAB控制信号发生器(USB-GPIB-HS)GPIB仪器控制教程(含matlab代码)

自动化测试时需要自动产生信号,通过matlab控制信号发生器的频率与功率,以实现自动化信号生成输出

qq_43686057的博客 1606

变量提升的常见情况总结

把当前上下文中带有var(提升声明)/function(提升声明+定义)进行提升的声明或者定义。变量提升是将变量声明提升到它所在作用域的最开始的部分。window。

最爱松露巧克力 1138

Gazebo仿真平台模型搭建与修改

ROS里踩过的坑(一)Gazebo仿真平台模型搭建与修改文件讲解Models 文件World文件Launch文件模型编辑可视化编辑配置文件编辑模型展示如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出...

Redglass的博客 1万+

【JavaScript】JS为什么要进行变量提升?

前言: 用过的JavaScript的应该都知道,它有变量提升的机制,不过可能很少去考虑为什么会有变量提升的机制,现在就来看一下为什么要进行变量提升。 1. 什么是变量提升? 变量提升实际上很容易理解,就是说在任何位置所声明的变量或函数,都会自动“提”到最前面,就好像它们是在函数的开头声明的一样。 2. 为什么进行变量提升? 首先我们要知道,JS在拿到一个变量或者一个函数的时候,会有两步操作,即解析和执行。 在解析阶段,JS会检查语法,并对函数进行预编译。解析的时候会先创建一个全局执行上下文环境,先把代码

公众号:前端充电宝 4683

Synthesia技术浅析(四):自然语言处理

Synthesia 的自然语言处理(NLP)模块是其核心技术之一,涵盖了文本转语音(TTS)、情感分析以及多语言支持等多个方面。

m0_75253143的博客 1166

基于 Simulink 的 PFC + LLC 级联系统联合仿真与优化实战教程

摘要:本教程详细介绍了2kW级AC-DC变换器建模方法,采用"BoostPFC+LLC谐振变换器"组合架构。重点解析了双级系统的核心控制策略:前级BoostPFC实现功率因数校正(PF>0.95),后级LLC通过变频调制(PFM)实现高效能量传输。教程包含四大关键步骤:PFC建模与控制、LLC参数计算与实现、母线电容优化设计以及系统联合调试,特别针对级联系统常见的母线电容震荡问题提供了解决方案。同时给出了仿真波形分析指南和避坑建议,包括代数环处理、仿真步长设置等实用技巧,为新能源车

MHD0815的博客 118

JavaScript变量提升详解

变量提升 在js中我们用var声明的变量是存在变量提升的。换句话说,我们js的解释器在解释js代码的时候,会优先把所有的变量声明提到前面。 示例代码 var的变量提升 下面我演示的就是一个简单的变量提升的问题。 js源代码 console.log(a) var a=1 console.log(a) js解释器编译的顺序: //js编译时会把所有的变量声明提前 var a; console.log(a)//显示undefiend,因为此时a没有赋值不知道数据类型 a=1//赋值操作不提前,只是var a的声

程麒阁的博客 1049

uniapp [全端兼容] - 详细实现全局修改设置字体大小功能效果,统一修改页面字号字体大小,一键改变字号整个项目立即生效,大中小字号预设、老年人大字模式场景,uniApp全平台兼容控制页面字号大小

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,修改字体大小,一键调整UniApp字体大小,实时改变不用刷新,动态设置字体大小,uniapp全局修改字体字号大小,如何控制全局字号,可调整显示的字体,全项目生效,老年人大字模式,改变所有页面的字体,全局设置字体大小,实现小中大的字体切换,设置改变全局字体大小功能,如何做到全平台兼容,H5APP实现全局字体大小调整,不兼容报错,用户设置字号,全局设置应用字体大小,大中小字体修改,页面设置page-me

🏆 前端领域优质创作者 1万+

详解javascript中的变量提升和函数提升

这篇文章主要介绍了详解javascript中的变量提升和函数提升的相关资料,需要的朋友可以参考下 1在js中只有两种作用域 a:全局作用域 b:函数作用域 在ES6之前,js是没有块级作用域。 首先来解释一下什么是没有块级作用域? 所以此时 是可以打印输出变量a的值。 2:什么是变量提升? 在我们的js中,代码的执行时分两步走的,1、解析 2、一步一步执行 那么变量提升就是变...

一只苟延残喘的卑微蝼蚁 308

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

lph159的博客 1973

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

奋斗的小前端 744

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

js中的变量提升详解

首先了解一下什么是变量提升?先来看一下一个小案例 a = 10; var a; console.log(a); //你认为输出的结果是什么 我们一般而言代码从上而下执行,a应该输出undefined,但是实际输出的却是10,这是为什么呢?就js而言代码并不是严格按照从上而下的执行顺序。 这其中就涉及到了变量提升的问题。它会将当前作用域的所有变量的声明提升到程序的顶部,怎么理解...

qq_45335128的博客 363

js变量提升_js变量提升与函数提升的过程详解

js的变量提升与函数提升 先来看两个栗子?,下面的两段代码分别输出什么?//代码段1functionfoo(){vara=1;functiona(){}console.log(a);}foo();//代码段2functionfoo(){vara;functiona(){}console.log(a);}foo();答案是:代码段1打印的...

weixin_39619478的博客 83

【JS】变量提升和函数提升详解

为什么会有“提升”的概念,简单来说,就是JS在执行之前会经历预编译的阶段,在这个过程中会将变量声明与函数声明提升到作用域的头部。变量声明的提升是以变量所处的第一层词法作用域为“单位”的,即全局作用域中声明的变量会提升至全局最顶层,函数内声明的变量只会提升至该函数作用域最顶层。在ES6之前,变量通常用var来声明,此时在作用域内存在变量提升【在ES6之后,引入了块级作用域的概念,如果用let const去声明变量,会存在暂存死区,即虽然存在提升但是在变量的声明定义语句之前不可以调用,否则报错 】典例:

weixin_57208584的博客 661

详解 javascript 变量提升

前言: 变量提升是在面试中常见被问到的问题,今天就来说一下这个问题。 一、概念 使用 var 来声明变量的时候,会提到当前作用域的顶端,赋值语句在原地等待赋值。 javascript 在执行的时候会分为两部分: 预编译阶段:js 在变量声明提升的时候,会将 var 声明的变量以及用关键字函数声明的函数都会提升到当前作用域的顶端,赋值语句在原地等待赋值。 这里要注意:如果变量名与函数相同的情况下,函数的优先级大于变量 执行阶段:自上而下执行 案例: <body> <in

风向决定发型的博客 207

JavaScript的变量提升详解

A =2; Var a ; console.log(a); 会输出啥? 结果: 2 它会将当前作用域的所有变量的声明提升到程序的顶部 Console.log(a); Var a=2; 输出 undefined 为什么会有這种现象? js和其他语言一样,都要经历编译和执...

xl8848的博客 158

详解JavaScript变量提升

详解JavaScript变量提升 本文转载自:众成翻译 译者:loveky 链接:http://www.zcfy.cc/article/465 原文:http://rainsoft.io/javascript-hoisting-in-details/?utm_source=javascriptweekly&utm_medium=email 变量在程序中随处可见。它们是一些始终在

bear_wr的专栏 413
上一篇: Javasript设计模式之链式调用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值