• 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);//报错
    
  • 相关阅读:
    树上差分
    Java学习笔记(二)事件监听器
    Java学习笔记(三)Java2D组件
    1066. Root of AVL Tree (25)
    有一种蓝,是神往,是心醉,是心伤
    软考论文的六大应对策略V1.0
    iOS 图形编程总结
    【悼鲁迅】诗一首
    【秋游】诗一首
    【游普罗旺斯薰衣草庄园】诗一首
  • 原文地址:https://www.cnblogs.com/yujiao-99/p/12661086.html
Copyright © 2020-2023  润新知