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. python2.7 安装pycrypto库报错
  2. 【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框获取组件实例常用的两种方式...
  3. Android之All children of ConstraintLayout must have ids to use ConstraintSet
  4. java获取主机mac_Java 如何获取主机的MAC地址
  5. 《走出软件作坊》流水账
  6. windows oracle .msb not found,oracle安装, Message file sp1lang.msb not found
  7. winform实现下拉框检索
  8. host速度 mtk usb_MTK功能机MT2503平台USB充电电流设置
  9. imx6ull linux bluetooth移植
  10. 凿音下载 1.26 安卓版
  11. 一年月份大小月口诀_农历大小月卦口诀详解(最新版)
  12. ps如何创造图层蒙版
  13. 【 信息搜集的内容,信息搜集的方法,信息搜集的工具,信息搜集结果的利用等】
  14. Python实现PU口袋活动更新提醒
  15. Win10 LTSB/LTSC安装微软商店/Microsoft store
  16. 计算机网络各层设备及作用
  17. PHP接口_短信发送接口
  18. Makefile编译忽略warning或者将warning视为error
  19. ubuntu软件包降级命令_如何在Ubuntu上降级软件包
  20. python 微信授权 昵称乱码解决

热门文章

  1. python实战游戏开发——添加飞船图像
  2. 视觉有难,八方点赞。
  3. STM32 USB通信
  4. 图幅号工具(免费转换坐标、查询图幅)
  5. SQL优化篇:如何成为一位写优质SQL语句的绝顶高手!
  6. 【奇函数】问题:奇函数是否一定过零点?
  7. 软件工程实训 服装库存管理系统
  8. 【号外】百度市值一日蒸发349亿元 “莆田系”上市公司股价齐跌
  9. 软件工程结队项目——智能点餐系统典型用户及用户场景分析
  10. 通过https协议发送skype信息给朋友python