let和const命令
JavaScript中使用var去声明变量,es6拓展两个,let和const
let和const都有块级作用域
什么是块级作用域,简单理解就是一个大括号就是一个块
我们先看一个var定义的变量
if(false) { var a = 100; } console.log(a) // undefined
注意:undefined不是错误,而是一种特殊的数据类型,是合法的,允许存在的,所以就说明一个问题,if语句的括号没有限制住a的作用域,所以我们可以这么认为var定义的变量是没有块级作用域的
我们再来看一下let和const的定义的变量
//let定义的变量 if(true) { let b = 200; } console.log(b) //报错 // const定义的变量 if(false) { const c = 300; } console.log(c) //报错
发现let和const定义的变量,无论if条件中为true或者false,内部的括号都会封闭自己的作用域
总结:let和const定义的变量有一个特点,就是在哪一级定义的,就在哪一级使用,因为有自己的块限制
不仅if条件语句可以作为块级作用域,循环语句也可以
使用var定义一个数组
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10
再看使用let定义的数组
var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6
let和const声明的变量都没有声明提升
什么是变量声明的提升?
看var定义的变量
console.log(a) // undefined var a = 100;
发现a会返回undefined,并不会报错,那是因为a此时已经定义了,并且提升到了当前作用域(全局作用域或者函数的作用域)的最顶部
所以上面的代码和下面的代码是等价的
var a; console.log(a) // undefined a = 100;
所以var是有变量声明提升的。
// let 声明 console.log(b) // 报错 let b = 200; // const 声明 console.log(c) // 报错 const c = 300;
我们再看let和const
上面错误信息的大致意思就是b或者c不能再初始化之前使用,所以let和const不能进行变量声明提升,必须在变量的声明后进行使用
let和const是会出现暂时性死区
什么是暂时性死区?
先看var定义的变量
//var定义 var tmp = 123; if (true) { tmp = 'abc'; var tmp; }
我们再看let和const定义的变量
// let 定义 var tmp = 123; if (true) { tmp = 'abc'; // 报错 let tmp; }
// const 定义 var tmp = 123; if (true) { tmp = 'abc'; // 报错 const tmp; }
{ var a = 100; let a = 200; }
发现重复定义变量也会报错
暂时性死区和重复定义有着一定关联关系,我们所说的暂时性死区和重复定义变量都是需要避免的,会报错影响我们的主流程的,所以一定要理解含义,而不是去模仿暂时性死区或者重复定义变量的问题
let定义的是变量,const定义的是常量
var定义的就是变量,let和之有类似
let a = 100; a = 200; // 正常修改 const b = 100; b = 200; // 报错
发现const定义的是常量,常量是不允许修改的,什么时候会用到常量,比如我们定义一个基数(PI)const PI = 3.14这个PI常量就一定不能修改
let和const定义的全局变量不是window的属性
var定义的全局变量是window的属性
var a = 12345; console.log(window.a) // 12345
let 和 const定义的全局变量不会成为window的属性
let a = 12345; console.log(window.a) // undefined const b = 12345; console.log(window.b) // undefined