JS中let和var的区别(附加const声明特点)

ES6 新增了let命令,用来声明局部变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束。

区别:

  • 使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象
  • 使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升
  • let不允许在相同作用域内,重复声明同一个变量

let 配合for循环的独特应用

let非常适合用于 for循环内部的块级作用域。JS中的for循环体比较特殊,每次执行都是一个全新的独立的块作用域,用let声明的变量传入到 for循环体的作用域后,不会发生改变,不受外界的影响。例如:

for (var i = 0; i <10; i++) {  
  setTimeout(function() {  // 同步注册回调函数到 异步的 宏任务队列。
    console.log(i);        // 执行此代码时,同步代码for循环已经执行完成
  }, 0);
}
// 输出结果
10    10    10    10    10    10    10    10    10    10

当我们将var改为let:

// i虽然在全局作用域声明,但是在for循环体局部作用域中使用的时候,变量会被固定,不受外界干扰。
for (let i = 0; i < 10; i++) { 
  setTimeout(function() {
    console.log(i);    //  i 是循环体内局部作用域,不受外界影响。
  }, 0);
}
// 输出结果:
0  1  2  3  4  5  6  7  8 9

let没有变量提升与暂时性死区

ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。用let声明的变量,不存在变量提升。而且要求必须等let声明语句执行完之后,变量才能使用,不然会报Uncaught ReferenceError错误

let变量不能重复声明

let不允许在相同作用域内,重复声明同一个变量。否则报错:Uncaught SyntaxError: Identifier 'XXX' has already been declared

var a = 1;
var a = 2;//不会报错
let b = 1;
let b = 2;//报错:Uncaught SyntaxError: Identifier 'XXX' has already been declared

const声明的特点

可以理解为,let的特性const都有,不能反复声明,存在块级作用域,不存在变量提升,也有暂时性死域的特点。与let区别在于,const声明的是一个常量,一旦声明就无法修改

const a = {};
a.b = 1;
console.log(a);//{b:1}const声明的变量并非变量的值不能修改,而是可以理解为变量的指向不能修改,所以这里不会出错
a = [];//这里直接修改了变量a的指向。
console.log(a);//报错

猜你喜欢

转载自www.cnblogs.com/yujiao-99/p/12661086.html
今日推荐