js中var和let的区别

varJavaScript刚出现时就存在的变量声明关键字,而let作为ES6才出现的变量声明关键字,无疑两者之间存在着很大的区别。那么具体有哪些区别呢?

1.作用域表现形式不同

var是函数作用域,let是块级作用域

1

2

3

4

5

6

{

  var monkey='孙悟空';

  let pig='猪八戒';   

}

console.log(monkey); //输出undefined

console.log(pig); //报错:pig is not deined

由上面代码可见,let声明的变量只在其所在的代码块有效,在代码块外部无效无法访问,而var声明的变量在该代码块所在的函数作用域内都有效。

2.是否变量提升的区别

var声明的变量会进行变量提升,let声明的变量不会进行变量提升。

1

2

3

4

5

console.log(monkey); //undefined

var monkey='孙悟空';

console.log(pig); //报错:pig is not defined

let pig='猪八';

同样的逻辑,为什么var声明的变量在它声明之前调用会显示未定义,而let声明的变量在声明之前调用会抛出异常呢,这就是两者在变量提升上的区别,var声明的变量存在变量提升,let声明的变量不存在变量提升。

那么什么叫变量提升呢,我这里不做概念性的描述,我只说我个人的理解,就是以上代码实际上相当于如下:

1

2

3

4

5

6

7

var monkey;

console.log(monkey); //undefined

monkey='孙悟空';

console.log(pig); //报错:pig is not defined

let pig='猪八戒';

看见区别了吗,var声明的变量会将声明的变量提取到作用域的最上面进行定义但不赋值,赋值操作还是在你的代码处,所以你在调用var声明的变量时就是一个已经声明但是并未定义值的变量,所以调用结果就是undefined,这就是所谓的变量提升。而let定义的变量不存在这种变量提升。

3.暂时性死区上的区别

暂时性死区:如果在某一作用域内let了一个变量,如果外部作用域中有相同名称的变量,那么就算在作用域内进行了更改,也不会影响到外部作用域

具体表现如下:

1

2

3

4

5

6

7

8

9

10

for(var i=0;i<5;i++){

    setTimeout(function(){

        console.log(i)

    },1000)

}

for(let i=0;i<5;i++){

  setTimeout(function(){

     console.log(i)         

  },1000) 

}

请问这两处代码的运行结果分别是什么?

第一处代码运行完毕的结果是1s后顺序打印5个5;第二处代码运行完毕的结果是1s后顺序打印0,1,2,3,4。

请问为什么会存在这种区别?

因为第一处代码的变量i由var关键字声明,不存在关键性死区,即你在1s后setTimeout中访问到的变量i是全局上下文中for循环运行完毕之后的i,所以打印的结果全是5;

而第二处代码的变量i由let关键字声明,产生了关键性死区,存在setTimeout中的i变量是你当时存储时的i的值,这个存储区间的i不会因为外面有相同的i变量且赋了不同的值而改变,他依旧是之前存储进去的值,这就是暂时性死区的表现,也是为什么第二处代码运行完毕是顺序打印0,1,2,3,4的原因。

4.在同一个上下文中var可以重复声明,let不行

1

2

3

4

let monkey='孙悟空';

let monkey='齐天大圣'; //报错:Identifier 'a' has already been declared

var pig='猪八戒';

var pig='猪悟能'//正常访问,变量pig的值被替换

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ToBeWritten之硬件安全

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

操作系统-系统启动

一、OS 的启动过程 1.1 启动流程 ​ 在讲启动问题的时候&#xff0c;我手头其实可以参考的教材或者纸质资料并不多&#xff0c;如果有&#xff0c;很多也是偏向工具性的阐述&#xff0c;而不是理论化的结构。只能说是在这里给出一个直观的、不太严谨的描述&#xff0c;如果之…

仿造问卷星--开发一套调查问卷设计工具(1/3)--完整流程

一&#xff0c;开发前的准备 第一步&#xff0c;初始化项目 创建package.json 首先&#xff0c;新建一个空文件夹项目&#xff0c;在空文件上按shift键同时鼠标右击&#xff0c;打开命令终端窗口 npm init第二步&#xff0c;安装项目依赖 Parcel 快速部署工具&#xff0c;…

1.Flask介绍与环境

文章目录1 什么是flask?2 为什么要有flask?3 环境安装4 开始我们的第一个Flask程序代码拆分为三部分第一部分第二部分第三部分5Werkzeug简介6运行项目1 什么是flask? Flask是一个Python编写的Web 微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务&…

【I2C】通用驱动i2c-dev分析

文章目录1. 前言2. i2c-dev驱动的注册过程3. open_i2c_dev函数分析4. set_slave_addr函数分析5. i2c_read_bytes函数分析1. 前言 前面分析i2c-tool测试工具就是基于drivers/i2c/i2c-dev.c驱动来实现的。i2c-dev驱动在加载时会遍历所有的I2C总线(i2c_bus_type)上所有注册的adap…

【需求分析】到【技术文档】实录

1. 需求背景 1. 文档:我要在ddyy首页,美食分类tab下做一个活动,活动期间有严格时间限制,比如从7.01号-7.18号23:59:59是活动期,需要透出大促期间的活动feed;大促结束后需要下线活动feed,同时美食分类tag下展示日常feed; 2. 需求目标:提高ddyy的GMV收入;引导用户在ddy…

C++之多态

文章目录前言一、多态的概念二、多态的定义及实现1.多态的构成条件2.虚函数3.虚函数的重写&#xff08;覆盖&#xff09;4.虚函数重写的两个例外4.C11中的override和final关键字三、重载、重定义&#xff08;隐藏&#xff09;、重写&#xff08;覆盖&#xff09;的区分四、抽象…

Oracle JDK 和 OpenJDK 有什么区别?

可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么 Oracle JDK 和 OpenJDK 之间是否存在重大差异&#xff1f;下面我通过收集到的一些资料&#xff0c;为你解答这个被很多人忽视的问题。 首先&#xff0c;2006 年 SUN 公司将 Java 开源&#xff0c;也就有…

用于 Android 开发的 8 大 Kotlin 高级编程技术

用于 Android 开发的 8 大 Kotlin 高级编程技术 在本文中&#xff0c;我们探索了专门为增强 Android 开发而量身定制的高级 Kotlin 编程技术。作为一种现代、富有表现力且功能强大的语言&#xff0c;Kotlin 已成为许多 Android 开发人员的首选。通过利用本文介绍的高级技术&…

InstructABSA基于指示学习的情感分析方法

这篇文章还没有正式发出&#xff0c;只是罗列了大概内容。文章主要应用指示学习的思想&#xff0c;首先介绍下指示学习。指示学习是谷歌Deepmind的Quoc V.Le团队在2021年的一篇名为《Finetuned Language Models Are Zero-Shot Learners》文章中提出的思想。指示学习的目的是去挖…

【新2023Q2押题JAVA】华为OD机试 - 字母消消乐

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:字母消消乐 题目 游戏规则:…

【C++】string类的模拟实现

目录 一、前言 二、模拟实现 1、构造函数 2、拷贝构造函数 3、operator 4、operator[] 5、迭代器 6、string类的比较 7、string类的扩容 7.1、reserve 7.2、resize 8、string类的尾插 8.1、push_back 与 append 8.2、operator 9、string类的insert 9.1、插入字符…

免费且好用的ssh工具FinalShell的下载与安装

一、FinalShell介绍 1.1 特色功能 云端同步,免费海外服务器远程桌面加速,ssh加速,本地化命令输入框,支持自动补全,命令历史,自定义命令参数。 1.2 主要特性 1.多平台支持Windows,macOS,Linux&#xff1b; 2.多标签,批量服务器管理&#xff1b; 3.支持登录ssh和Windows远程桌…

iPhone14升级iOS16.4正式版后无法连接WiFi怎么办?

近日&#xff0c;有不少iPhone用户反映升级至iOS16.4正式版后出现了无法连接WiFi&#xff0c;或是在显示已联网&#xff08;WiFi/5G/4G&#xff09;的情况下莫名频繁断网情况&#xff0c;重新开启、关闭飞行模式也不能解决问题。 iOS16 确实新增了不少实用功能&#xff0c;非常…

Echars数据可视化

文章目录数据可视化是什么&#xff1f;数据可视化常用技术&#xff1a;Echarts-介绍介绍功能运行环境echarts常用组件Echarts-体验五分钟上手教程Echarts-基础配置让图表跟随屏幕自适应Echarts基础实例柱状图-竖向第一步&#xff1a;引入到html页面中第二步&#xff1a;根据需求…

java设计模式之代理模式

代理模式 代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标目标对象&#xff0c;可以在目标对象实现的基础上&#xff0c;增强额外的功能操作&#xff0c;即扩展目标对象的功能。 被代…

华为“捅破天”,P60扛大旗

文丨智能相对论 作者丨沈浪 时隔一年半&#xff0c;华为手机P系列再度迎来更新&#xff0c;P60的发布如期把华为拉回了国内智能手机市场的中心。 3月30日&#xff0c;华为P60正式开启全渠道销售&#xff0c;各大城市门店纷纷排起了长队。在广州&#xff0c;华为门店大排长队…

【设计模式】创建型-原型模式

文章目录一、原型模式一、原型模式 原型模式的角色&#xff1a; 抽象原型类 抽象原型类是定义具有克隆自己的方法的接口&#xff0c;是所有具体原型类的公共父类&#xff0c;可以是抽象类&#xff0c;也可以是接口 具体原型类 具体原型类实现具体的克隆方法&#xff0c;在克隆…

天猫食品饮料数据分析:2月份茶饮料品牌销量TOP10排行榜!

近年来&#xff0c;茶饮料品类逐渐丰富&#xff0c;也在潜移默化中激发消费者的购物欲望&#xff0c;茶饮料行业的整体市场规模也不断增长。 根据鲸参谋电商数据显示&#xff0c;2023年2月份在天猫平台上&#xff0c;茶饮料相关产品的月销量将近149万件&#xff0c;环比增长约…

学习提高:Idea 使用docker 部署SpringBoot应用并指定JVM参数,jdk8版本

最近项目中需要使用docker进行开发和部署SpringBoot应用&#xff0c;因此进行相关研究。 1、新建SpringBoot项目 2、新建Dockerfile文件 内容如下&#xff1a; #这是基础镜像 FROM java:8 # 维护者信息 MAINTAINER demo VOLUME /tmp #复制jar包到镜像中&#xff0c;并且将名字…
最新文章