什么是变量提升?var、let 及 const 区别?什么是暂时性死区?

目录

前言

一、什么是变量提升(hoisting)

var使用

为什么要存在变量提升?

二、var、let 及 const 区别?

let声明

const声明 

var,let ,const区别

三、什么是暂时性死区

四、总结


前言

相信大家在面试中经常遇到这样的问题,什么是变量提升?var、let 及 const 区别?什么是暂时性死区?下面我们具体了解下,方便大家参考,不足之处欢迎大家补充。

一、什么是变量提升(hoisting)

var使用

 我们先看一段代码:

console.log(a) // undefined
var a = 1

从上述代码中我们可以发现,虽然变量还没有被声明,但是我们却可以使用这个未被声明的变量,这种情况就叫做变量提升,并且提升的是声明。

对于这种情况,我们可以把代码这样来看

var a
console.log(a) // undefined
a = 1

 接下来我们再来看一个例子

var a = 10
var a
console.log(a)

对于这个例子,如果你认为打印的值为 undefined 那么就错了,答案应该是 10,对于这种情况,我们这样来看代码

var a
var a
a = 10
console.log(a)

到这里为止,我们已经了解了 var 声明的变量会发生提升的情况,其实不仅变量会提升函数也会被提升。

console.log(a) // ƒ a() {}
function a() {}
var a = 1

对于上述代码,打印结果会是 ƒ a() {},即使变量声明在函数之后,这也说明了函数会被提升,并且优先于变量提升。

为什么要存在变量提升?

存在的根本原因就是为了解决函数间互相调用的情况

function test1() {test2()
}
function test2() {test1()
}
test1()

假如不存在提升这个情况,那么就实现不了上述的代码,因为不可能存在 test1 在 test2 前面然后 test2 又在 test1 前面。

二、var、let 及 const 区别?

let声明

let声明和var声明用法是一样,都是定义变量,使用let声明的变量没有var那样的变量提升,let声明的变量只在当前作用域中有效。

{ // 块级作用域let a1 = 2;
}
console.log(a1);  // 报错:a1 is not defined

const声明 

const声明被称为常量,为了更好理解,下文还是用变量进行介绍

const和let非常相似:不能声明重名变量、存在暂时性死区、没有变量提升、有块级作用域限制。这些都是非常nice的规则,在此基础上,const还增加了两个规则:1、声明时必须赋值;2、值不可修改;声明时必须赋值这个很好理解,就是在创建的时候必须给这个变量一个初始值。我们详细说一下值不可修改这一点:

const a = '2';
a = 2; // 报错a变量已经声明,不能重复创建:entifier 'a' has already been declared

上面代码首先我们创建了const变量并为其赋值字符串类型的’2’,在第二行代码实际上是想把数字类型的2赋值给刚刚创建的const变量中,这时候确保错了,由此可见const变量适合用在值不会变的场景。还有一种情况就是给const变量赋值数组和对象类型的值,因为这两个数据类型属于引用类型,所以只要在引用地址值不变的情况下,更改、新增、删除对象或数组中的元素是不会报错的。 

var,let ,const区别

相同点:var,let,const三者都可以声明变量

不同点: 

  1.       var 存在变量提升 而let 与const不存在变量提升
  2.       var 定义的变量可以声明很多次,而let. const定义的变量只能声明一次
  3.       var.let声明的变量可以再次赋值,而const声明的变量不能再次赋值
  4.       var声明的变量没有自身的作用域,而let、const声明的变量有自身的作用域(块级作用域
  5.       利用var定义的变量,会自动挂载到window,但是let和const不会
  6.       let和const 存在暂时性死区问题 
  7.       let const let定义变量    const定义常量

三、什么是暂时性死区

我们先来看一个例子:

var a = 1
let b = 1
const c = 1
console.log(window.b) // undefined
console.log(window. c) // undefinedfunction test(){console.log(a)let a
}
test()

首先在全局作用域下使用 let 和 const 声明变量,变量并不会被挂载到 window 上,这一点就和 var 声明有了区别。

再者当我们在声明 a 之前如果使用了 a,就会出现报错的情况

报错的原因是因为存在暂时性死区,我们不能在声明前就使用变量,这也是 let 和 const 优于 var 的一点。然后这里你认为的提升和 var 的提升是有区别的,虽然变量在编译的环节中被告知在这块作用域中可以访问,但是访问是受限制的。

四、总结

  1. 函数提升优先于变量提升,函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用域顶部。
  2. var 存在提升,我们能在声明之前使用。letconst 因为暂时性死区的原因,不能在声明前使用。
  3. var 在全局作用域下声明变量会导致变量挂载在 window 上,其他两者不会。
  4. let 和 const 作用基本一致,但是后者声明的变量不能再次赋值。

欢迎在评论区交流。

如果文章对你有所帮助,❤️关注+点赞❤️鼓励一下!博主会持续更新。。。。

我的博客:https://code-nav.top

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

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

相关文章

Sectigo怎么把多个网站地址改为https

随着电脑以及手机的普及,全世界的人都已经习惯在互联网提问、购物、浏览资讯等,越来越多的用户开始担心自己的信息(银行卡号、电话、支付密码等)被窃取以及篡改。SSL数字证书将http明文传输协议改为https加密传输协议,可以对网站传输信息加密…

基于图论的图像分割 python + PyQt5

数据结构大作业,基于图论中的最小生成树的图像分割。一个很古老的算法,精度远远不如深度学习算法,但是对于代码能力是一个很好的锻炼。 课设要求: ( 1 )输入:图像(例如教室场景图&a…

声明式的管理方法文件

1.声明式管理方法(yaml)文件 1.适合对资源的修改操作 2.声明式管理依赖于已有yaml文件,所有的内容都在yaml文件中声明 3.编辑好的yaml文件还是要依靠陈述式的命令发布到k8s集群当中 2.声明式的三种格式 1.deployment的yaml文件 demonset…

rime中州韵 输入字符透传 lua Translator

在 rime中州韵 help lua Translator 中我们分享了如何使用 lua 脚本定义一个 translator,并以 五笔・拼音 为例引用了该 translator,并且达到了预期的效果。 今天,我们继续通过 lua 脚本为 rime中州韵/小狼毫 输入法打造一个 translator&…

【华为机试】2023年真题B卷(python)-非严格递增连续数字序列

一、题目 题目描述: 输入一个字符串仅包含大小写字母和数字,求字符串中包含的最长的非严格递增连续数字序列的长度(比如12234属于非严格递增连续数字序列)。 二、输入输出 输入描述: 输入一个字符串仅包含大小写字母和数字&#x…

让你的隧道代理HTTP使用更加顺畅高效

在数字世界的探险中,隧道代理HTTP是我们穿越网络限制的重要工具。但有时候,我们可能会遇到连接不稳定、速度慢等问题。如何让隧道代理HTTP使用更加顺畅高效?下面是一些建议和技巧。 一、选择合适的代理服务器 代理服务器的地理位置、性能和…

【愚公系列】2023年12月 HarmonyOS教学课程 015-ArkUI组件(Radio)

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主&#xf…

ARMday9

实现数码管不同位显示不同的数字 spi.h #ifndef __SPI_H__ #define __SPI_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" // MOSI对应的引脚输出高低电平的信号PE14 #define MOSI_OUTPUT_H() do{GPIOE->ODR | (0x1 << 14);…

MySQL的安装网络配置

目录 一. MySQL5.7的安装 二. MySQL8.0的安装 三. 配置网络访问 思维导图 一. MySQL5.7的安装 1. 解压 2. 将my.ini文件放入到解压文件中 3. 编辑my.ini文件&#xff0c;将路径改为当前路径 4. 进到bin目录下&#xff0c;以管理员身份打开cmd命令窗口 5. 安装MySQL服务 my…

Spring Boot 整合 AOP 实现接口切面日志

Spring Boot 整合 AOP 实现接口切面日志 什么是 AOP&#xff1f; AOP&#xff08;Aspect-Oriented Programming&#xff09;是一种编程范式&#xff0c;它允许开发人员将横切关注点&#xff08;如日志记录、性能统计、安全性等&#xff09;从主要业务逻辑中分离出来&#xff…

5233D误码测试仪

5233D误码测试仪 数字通信测量仪器 5233D误码测试仪主要用于数字光收发模块的误码性能测试。采用可更换接口板设计&#xff0c;可支持多种数字光收发模块&#xff0c;包括CFP、CFP2、CFP4、CFP8、CSFP、CXP、CXP2、DSFP、QSFP、QSFP、QSFP28、SFP、SFP、SFP28、XFP等。5233D误…

SpringCloud微服务 【实用篇】| Dockerfile自定义镜像、DockerCompose

目录 一&#xff1a;Dockerfile自定义镜像 1. 镜像结构 2. Dockerfile语法 3. 构建Java项目 二&#xff1a; Docker-Compose 1. 初识DockerCompose 2. 部署微服务集群 前些天突然发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…