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

 

posted @ 2021-10-23 20:01  keyeking  阅读(56)  评论(0编辑  收藏  举报