【变量提升】关于JavaScript变量提升的理解,它导致了什么问题?

在这里插入图片描述

😁 作者简介:一名大四的学生,致力学习前端开发技术
⭐️个人主页:夜宵饽饽的主页
❔ 系列专栏:JavaScript小贴士
👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前进的勇气

​🔥​前言:

这是我在整理JavaScript中觉得比较重要的基础知识,有关变量提升的,希望可以帮助到大家,欢迎大家的补充和纠正

文章目录

    • 11 关于JavaScript变量提升,它导致了什么问题
      • 一、前言:
      • 二、变量提升的原因
      • 三、函数声明的细节
      • 四、为什么要变量提升
      • 五、变量提升的缺点。
    • 六、 最后:

11 关于JavaScript变量提升,它导致了什么问题

一、前言:

😀在介绍变量提升之前,大家可以先看一段有意思的代码:

//第一种情况
a=2
var a;
console.log(a)//第二种情况
console.log(b)
var b=3

❓这两种情况的代码,大家可以猜一下最后会输出什么呢?

👉答案是:

  • 第一种情况会输出2
  • 第二种情况会输出undefined

这种输出是不是出乎意料,那么到底发生了什么呢?我们接下来一起来看看今天的”主角“概念,变量提升。

⭐什么是变量提升:变量和函数声明从它们在代码中出现的位置被提升”移动“到最上面

二、变量提升的原因

JavaScript代码在执行之前引擎会首先对其进行编译,编译阶段的一部分工作就是找到所有声明,并使用合适的作用域将它们关联起来,正是因为这个机制,包含变量和函数在内的所有声明都会在任何代码被执行前首先被处理

当我们看到一个变量赋值的语句时:

var a=2

可能会认为这是一个声明,但是JavaScript实际上会将其看成两个声明:var a;和a = 2。

第一定义声明是在编译阶段进行的,第二个渎职声明会被留着原地等待执行阶段,所以代码声明和赋值是在不同阶段的。

那么现在我们来看我们上面的代码,实际会以如下形式进行处理

//第一种情况
var a
a=2
console.log(a)//第二种情况
var b
console.log(b)
b=2

所以可以得知**代码是先声明后赋值,**只有声明本身会被提升,而赋值或其他运行逻辑会留在原地

三、函数声明的细节

看完变量之后,我们来了解一下函数声明,会有一些注意点

请看如下代码:

foo()function foo(){console.log(a) //undefinedvar a=2
}

上面代码中,函数是先调用后声明的,按自上到下的逻辑理解,这样显然是不合理的,但是这样依然可以正常执行,因为函数声明也会提升。而且在函数作用域内部的变量也会被提升,提升到函数作用域的最上方

每个函数作用域都会进行提升操作,提升到函数作用域的最上方

所以上面的代码可以理解为以下这种形式

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

注意,函数声明会提升,但是函数表达式不会被提升,切记!切记!

⭐函数声明和变量声明都会被提升,那么是哪一个先被提升,或者说当存在函数声明和变量声明,是谁在最上方

🌱函数会首先被提升,然后才是变量

四、为什么要变量提升

变量提升主要有两个原因:

  • 提高性能
  • 容错率更好
  1. 提高性能:在js代码执行之前,会进行语法检查和编译,而且这一操作只进行一次,如果没有这一步每次代码的执行都必须重新解析一遍代码,而且在解析的过程中,还会为函数生成预编译代码,那么当代码没有改变时,会直接使用预编译中的变量和函数,所以当代码执行时就不需要进行编译了,性能当然会提高。
  2. 容错率更好:虽然我们应该避免先赋值再声明,我们应该有先声明再赋值的好习惯,但是再JavaScript代码执行的过程中,这种先赋值再声明的错误写法也是可以正确执行的。

五、变量提升的缺点。

变量提升虽然有一些优点,但是他也会造成一定的问题,可以来看以下代码:

//第三情况
var tmp=new Date()function fn(){console.log(tmp)if(false){var tmp='老秀才'}
}fn()

在这个函数,原本要打印出外层的tmp变量,但是因为变量提升问题,导致内层的变量被提升到函数内部作用域的最顶层,相当覆盖了外层的tmp,所以输出结果undefined

六、 最后:

🌼下面推荐的一篇文章可以补充和扩展文章中涉及的知识点 😃

  • 【js作用域】JavaScript中作用域的是什么?:从编译时其承担什么角色和查询作用域中的变量的角度解析作用域

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

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

相关文章

大模型笔记:最少到最多提示过程 (Least to Most prompting, LtM)

LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS 2023 ICLR 1 概述 进一步发展维链提示过程 (CoT prompting) 分为两个阶段: 第一阶段:向语言模型提出查询,将问题分解成子问题。第二阶段:再次向语…

Z Potentials | 星爵,他的征途不止向量数据库

纵观过去几十年的科技发展史,每一代新的技术架构的出现往往都伴随着新的数据范式的出现,也催生了多家百亿到千亿美金数据平台的诞生。如果说 2023 年科技领域的关键词是 LLM,那么数据库领域的关键词一定非向量数据库莫属。向量数据库是一种专…

SpringMVC拦截器和过滤器执行顺序及区别

拦截器(Inteceptor)和过滤器(Filter)执行顺序? 拦截器和过滤器区别? 1、拦截次数不同: 过滤器:一次请求只能被一个过滤器拦截一次,它们按照在web.xml中的声明顺序依次执…

IJCAI23 - Continual Learning Tutorial

前言 如果你对这篇文章感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 本篇 Tutorial 主要介绍了 CL 中的一些基本概念以及一些过往的方法。 Problem Definition Continual Learning 和 Increm…

DataX及使用

DataX及使用 【一】DataX概述【二】DataX架构原理【1】设计理念【2】框架设计【3】运行流程【4】调度决策思路【5】DataX和Sqoop对比 【三】DataX部署【四】DataX上手【1】使用概述【2】配置文件格式【3】同步Mysql数据到HDFS 【五】DataX整合Springboot 【一】DataX概述 Data…

C++面试宝典【配文档,全方面学习】

原word文档[链接: https://pan.baidu.com/s/1CKnm7vHDmHSDskAgxgZgKA?pwdr4wv 提取码: r4wv 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v5的分享] 一、C / C基础 1、简述C的内存分区? 一个C、C程序的内存分区主要有5个…

【李沐精读系列】GPT、GPT-2和GPT-3论文精读

论文: GPT:Improving Language Understanding by Generative Pre-Training GTP-2:Language Models are Unsupervised Multitask Learners GPT-3:Language Models are Few-Shot Learners 参考:GPT、GPT-2、GPT-3论文精读…

Spring Boot异常处理和单元测试

1.SpringBoot异常处理 1.1.自定义错误页面 SpringBoot默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicErrorController 来处理/error 请…

LiveNVR监控流媒体Onvif/RTSP功能-支持云端录像监控视频集中存储录像回看录像计划配置NVR硬件设备录像回看

LiveNVR支持云端录像监控视频集中存储录像回看录像计划配置NVR硬件设备录像回看 1、流媒体服务软件2、录像回看3、查看录像3.1、时间轴视图3.2、列表视图 4、如何分享时间轴录像回看?5、iframe集成示例7、录像计划7、相关问题7.1、录像存储位置如何配置?…

阿里云和腾讯云区别价格表,云服务器费用对比2024年最新

2024年阿里云服务器和腾讯云服务器价格战已经打响,阿里云服务器优惠61元一年起,腾讯云服务器61元一年,2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比,阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

京东老矣,尚能饭否?

图片|《冰与火之歌》截图 ©自象限原创 作者丨程心 编辑丨罗辑 从2004年1月,京东正式涉足电商至今,整整二十年过去了。 2024年3月6日,京东发布了2023年第四季度及全年财报。数据显示,2023Q4京东收入3061亿元人民…

FPGA 按键控制串口发送

按键消抖 消抖时间一般为10ms,我使用的板子是ACX720,晶振为50MHZ,20ns为一周期。 状态机 模块设计 设计文件 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2023/01/11 12:18:36 // Design Name: // Module Name…