1.var声明的变量会存在变量提升,而let 和 const的变量不会存在变量提升

也就是var声明的变量会被提升到他所在的作用域顶端去

// var:
console.log(a) // 打印为 'undefined'
var a = 1
// let 和 const
console.log(b) // 报错, b没有被声明
let b = 2
console.log(c) // 报错, c没有被声明
const c = 3

2.var声明的变量会挂载到window上,会放在全局,let 和 const声明的变量不会

var a = 1
console.log(a, window.a) // 1  1
let b = 2
console.log(b, window.b) // 2  undefined
let c = 3
console.log(c, window.c) // 3  undefined

3.let和const声明的变量会形成块级作用域,var不会

也就是用let命令新增了块级作用域,外层作用域无法获取到内层作用域,非常安全明了。即使外层和内层都使用相同变量名,也都互不干扰。

{let b = 1var c = 2console.log(b) // 1
}console.log(c) // 2
console.log(b) // b is not defined,b不可以访问内层作用域值

4.let和const不能在同一作用域下声明同一变量名,而var可以

var a = 3
console.log(a)  // 3
var a = 5
console.log(5) // 5
//直接会报错:b已经被声明
let b = 1
console.log(b)
let b = 2
console.log(b)

PS:注意!!! 按照上面的理解大家肯定会认为a打印的值为什么不是上面声明的全局变量呢?

var a = 1
{console.log(a) // 这里打印会报错“Cannot access 'a' before initialization”let a = 1
}

上面代码中,存在全局变量a,但是块级作用域内let又声明了一个局部变量a,导致后者绑定这个块级作用域,所以在let声明变量前,对a赋值会报错。

ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。

敲黑板了!!!!!!那在for循环中let,const,var 又会有什么区别呢???
看一下使用var声明的

for (var i = 0; i < 3; i++) {setTimeout(() => {console.log(i)}, 1000)
}


可以看到这里的打印结果为3次3,一看懵了原谅我还是个小菜鸟。。网上百度了许多,这里写一下自己的理解。。。
for循环是同步任务,setTimeout是异步任务,因此要for循环完毕后才会执行setTimeout()。
②使用var声明的变量i是全局变量,在执行完for循环后,i已经变成了3,异步队列中有3次setTimeout任务,访问到的i都是同一个,这个时候打印出来的i当然是为 3 了

接下来看下let声明的

for (let i = 0; i < 3; i++) {setTimeout(() => {console.log(i)}, 1000)}


可以看到打印结果。更加诧异了,和var声明的打印出来的结果完全不同,执行过程还是和 ① 相同,唯一不同的是,此时for循环出来的i每次都不同,每次都创建了一个新的i,因此在异步任务的时候输出对应的i

要注意的是:不能使用const去声明,因为const是常量

js中let const var的区别相关推荐

  1. JS中 let 和var的区别

    JS中let和var 的区别 简单介绍let var的常见变量提升 ES6可以用let定义块级作用域变量 let配合for循环的独特应用 let没有变量提升与暂时性死区 let变量不能重复声明 简单介 ...

  2. js中Let和Var的区别

    写在前面: 本文转载自:https://www.cnblogs.com/fly_dragon/p/8669057.html 作者:FlyDragon 出处:http://www.cnblogs.com ...

  3. js中 let和var的区别

    引入let的原因正是var的局限性,相比于var,let有以下几点优势: 作用域 var的作用域是会提升的,var声明的变量只能是全局的或者是整个函数块的. let则允许声明一个作用域被限制在块级中的 ...

  4. css里面的let,js中let和var定义变量的区别

    javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是"javascript 严格模式",比如下述的代码运行就会报错: let hello = ' ...

  5. Js中的style,currentStyle,getComputedStyle()区别

    Js中的style,currentStyle,getComputedStyle()区别  样式表有三种方式: 1.内嵌样式(inline Style)-是写在Tag里面的,内嵌样式只对所有的Tag有效 ...

  6. js中的extend的用法及其JS中substring与substr的区别

    1.    JS中substring与substr的区别 之前在项目中用到substring方法,因为C#中也有字符串的截取方法Substring方法,当时也没有多想就误以为这两种方法的使用时一样的. ...

  7. js中click()与onclick()的区别

    由一个简单示例到 js中click()与onclick()的区别 之前朋友在学习js的时候遇到一个有意思的问题. 先贴一份代码说一下代码构成 这里是html结构 <ul><li> ...

  8. js中的const 命令

    js中的const 命令 一直以来我在我字典里认为const 命令就是用来声明一个常量,然后并非如此,这也是我在工作中偶然发现的,然后查了下文档才得知,记录在档,以供参考: const 定义 cons ...

  9. js中parentNode和parentElement的区别和用法

    了解本篇的基础必须知道什么是节点,关于html dom节点知识点和节点类型的知识,分别看<js节点都有哪些类型?怎么判断是哪种节点类型?>和<js属性节点获取和移除>,下面直接 ...

最新文章

  1. 使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。...
  2. 微信小程序——获取openGid
  3. oracle定时器每天下午6点_周五下午6点到8点 万盛经开区党工委书记、管委会主任袁光灿直播带货...
  4. 携程用的什么地图_2020什么项目最值得投资
  5. 浅谈Nginx负载均衡与F5(硬件)的区别
  6. cad指定服务器名称,配置网络许可服务器 | AutoCAD 2022 | Autodesk Knowledge Network
  7. 超形象!流体版的勾股定理演示动图...
  8. Precedence Problems of C Operators
  9. 使用JavaScript下进行iframe的DOM操作(考虑浏览器兼容性)
  10. 毕设题目:Matlab元胞自动机病毒仿真
  11. 苹果蓝牙耳机怎么接电话_如何在开车时可以更安全的接电话——ROMAN R6000蓝牙耳机...
  12. deepin系统修改IP地址记录
  13. C#委托二——委托协变
  14. 梁辉老师.狼性营销实战训练专家
  15. MTO和Manytasking MATP MOOMFO 中G函数
  16. STL笔记(二)---空间配置器
  17. 【电商】电商后台系统整体介绍
  18. Python Selenium 自动修改路由器WAN IP
  19. linux密码叹号,Linux中“!”感叹号用法技巧大全
  20. 机器学习第十章---降维与度量学习

热门文章

  1. 基于51单片机音乐盒仿真设计(音乐播放器)
  2. Selenium自动化绕过Cloudflare检测的方法
  3. 头歌实践教学平台软件工程答案
  4. ISE - ChipScope 使用教程
  5. HDU 2104 hide handkerchief
  6. 【优化算法】 简述遗传算法(GA)原理
  7. [转]程序员,如何从平庸走向理想?
  8. PC端获取摄像头图片并上传的实现
  9. 未来图灵发布《AI明星企业家热搜榜》
  10. Openvino IGPU(GPU) 读取模型(加载时间过长)中的读取缓存加速方式