js中let const var的区别
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的区别相关推荐
- JS中 let 和var的区别
JS中let和var 的区别 简单介绍let var的常见变量提升 ES6可以用let定义块级作用域变量 let配合for循环的独特应用 let没有变量提升与暂时性死区 let变量不能重复声明 简单介 ...
- js中Let和Var的区别
写在前面: 本文转载自:https://www.cnblogs.com/fly_dragon/p/8669057.html 作者:FlyDragon 出处:http://www.cnblogs.com ...
- js中 let和var的区别
引入let的原因正是var的局限性,相比于var,let有以下几点优势: 作用域 var的作用域是会提升的,var声明的变量只能是全局的或者是整个函数块的. let则允许声明一个作用域被限制在块级中的 ...
- css里面的let,js中let和var定义变量的区别
javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是"javascript 严格模式",比如下述的代码运行就会报错: let hello = ' ...
- Js中的style,currentStyle,getComputedStyle()区别
Js中的style,currentStyle,getComputedStyle()区别 样式表有三种方式: 1.内嵌样式(inline Style)-是写在Tag里面的,内嵌样式只对所有的Tag有效 ...
- js中的extend的用法及其JS中substring与substr的区别
1. JS中substring与substr的区别 之前在项目中用到substring方法,因为C#中也有字符串的截取方法Substring方法,当时也没有多想就误以为这两种方法的使用时一样的. ...
- js中click()与onclick()的区别
由一个简单示例到 js中click()与onclick()的区别 之前朋友在学习js的时候遇到一个有意思的问题. 先贴一份代码说一下代码构成 这里是html结构 <ul><li> ...
- js中的const 命令
js中的const 命令 一直以来我在我字典里认为const 命令就是用来声明一个常量,然后并非如此,这也是我在工作中偶然发现的,然后查了下文档才得知,记录在档,以供参考: const 定义 cons ...
- js中parentNode和parentElement的区别和用法
了解本篇的基础必须知道什么是节点,关于html dom节点知识点和节点类型的知识,分别看<js节点都有哪些类型?怎么判断是哪种节点类型?>和<js属性节点获取和移除>,下面直接 ...
最新文章
- python2.7 安装pycrypto库报错
- 【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框获取组件实例常用的两种方式...
- Android之All children of ConstraintLayout must have ids to use ConstraintSet
- java获取主机mac_Java 如何获取主机的MAC地址
- 《走出软件作坊》流水账
- windows oracle .msb not found,oracle安装, Message file sp1lang.msb not found
- winform实现下拉框检索
- host速度 mtk usb_MTK功能机MT2503平台USB充电电流设置
- imx6ull linux bluetooth移植
- 凿音下载 1.26 安卓版
- 一年月份大小月口诀_农历大小月卦口诀详解(最新版)
- ps如何创造图层蒙版
- 【 信息搜集的内容,信息搜集的方法,信息搜集的工具,信息搜集结果的利用等】
- Python实现PU口袋活动更新提醒
- Win10 LTSB/LTSC安装微软商店/Microsoft store
- 计算机网络各层设备及作用
- PHP接口_短信发送接口
- Makefile编译忽略warning或者将warning视为error
- ubuntu软件包降级命令_如何在Ubuntu上降级软件包
- python 微信授权 昵称乱码解决