当前位置: 首页 > news >正文

js知识点汇总之let const 和 var的区别

let const 和 var的区别

作用域

ES5 中的作用域有:全局作用域、函数作用域,ES6 中新增了块级作用域。块作用域由 { } 包括,if 语句和 for 语句里面的 { } 也属于块作用域。

var关键字

  1. 没有块级作用域的概念
// global scope
{var a = 10;
}
console.log(a); // 10

在全局中输出a为10说明var不存在块级作用域的概念

  1. 有全局作用域,函数作用域的概念

    var b = 20;
    function test() {var a = 10;console.log(a);console.log(b);
    }
    test();
    console.log(a);
    // 10 20 a is not defined
    
  2. 不初始化值默认为 undefined,存在变量提升

    console.log(a); //undefined
    var a;
    a = 10;
    
  3. 全局作用域用 var 声明的变量会挂载到 window 对象下

//Global Scope
var a = 10;
console.log(a);  //10
console.log(window.a);  //10
console.log(this.a);  //10
  1. 同一作用域中允许重复声明
//Global Scope
var a = 10;
var a = 20;
console.log(a);  //20checkscope();
function checkscope(){//Local Scopevar b = 10;var b = 20;console.log(b);  //20
}

上面代码中,在 Global Scope 中声明了 2a,以最后一次声明有效,打印为 20。同理,在 Local Scope 也是一样的。

let 关键字

  1. 有块级作用域的概念
{//Block Scopelet a = 10;
}
console.log(a);  //ReferenceError: a is not defined

上面代码中,打印 a 报错,说明存在 Block Scope 的概念。

  1. 不存在变量提升(不可以在声明之前使用)
{//Block Scopeconsole.log(a);  //ReferenceError: Cannot access 'a' before initializationlet a = 10;
}

上面代码中,打印 a 报错:无法在初始化之前访问。说明不存在变量提升。

  1. 暂时性死区
{//Block Scopeconsole.log(a);  //ReferenceError: Cannot access 'a' before initializationlet a = 20;
}if (true) {//TDZ开始console.log(a);  //ReferenceError: Cannot access 'a' before initializationlet a; //TDZ结束console.log(a);  //undefineda = 123;console.log(a);  //123
}

上面代码中,使用 let 声明的变量 a,导致绑定这个块级作用域,所以在 let 声明变量前,打印的变量 a 报错。

这是因为使用 let/const 所声明的变量会存在暂时性死区。

什么叫做暂时性死区域呢?翻译成人话就是:

当程序的控制流程在新的作用域(module、functionblock 作用域)进行实例化时,在此作用域中用 let/const 声明的变量会先在作用域中被创建出来,但因此时还未进行词法绑定,所以是不能被访问的,如果访问就会抛出错误。因此,在这运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区。

再简单理解就是:

ES6 规定,let/const 命令会使区块形成封闭的作用域。若在声明之前使用变量,就会报错。
总之,在代码块内,使用 let/const 命令声明变量之前,该变量都是不可用的。
这在语法上,称为 “暂时性死区”temporal dead zone,简称 TDZ)。

其实上面不存在变量提升的例子中,其实也是暂时性死区,因为它有暂时性死区的概念,所以它压根就不存在变量提升了。

  1. 同一块作用域中不允许重复声明
{//Block Scopelet A;var A;  //SyntaxError: Identifier 'A' has already been declared
}
{//Block Scopevar A;let A;  //SyntaxError: Identifier 'A' has already been declared
}
{//Block Scopelet A;let A;  //SyntaxError: Identifier 'A' has already been declared
}

const 关键字

  1. 必须立即初始化,不能留到以后赋值
// Block Scope 
const a; // SyntaxError: Missing initializer in const declaration } 

上面代码中,用 const 声明的变量 a 没有进行初始化,所以报错。

  1. 常量的值不能改变
//Block Scope 
{const a = 10; a = 20; // TypeError: Assignment to constant variable
}

上面代码中,用 const 声明了变量 a 且初始化为 10,然后试图修改 a 的值,报错。

const 实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。

相关文章:

  • 如何利用51建模网,实现3D模型线上展示和应用?
  • 【数据结构】——顺序表与链表
  • C++ RPC ORM 高速解析
  • pycharm 关闭项目卡死
  • 软件测试/测试开发丨学习笔记之Allure2测试报告
  • 探索Ollama——入门:如何在本地环境中搭建和自定义大型语言模型
  • 【跟着例子学MySQL】多表关联 -- 一对一关系
  • 深入解析Java中的Calendar类
  • ❤ vue2 使用 Element和 vue3 使用 ElementPlus报错
  • 鸿蒙应用开发系列 篇六:鸿蒙系统应用生态与发布、推广
  • GD32F407入坑指南 第三章
  • nssctf(Web刷题)
  • ffmpeg-webrtc(metartc)给ffmpeg添加webrtc协议
  • 如何申请免费域名级SSL证书,实现HTTPS访问
  • AI大模型探索之路-实战篇4:DB-GPT数据应用开发框架调研实践
  • 【刷算法】从上往下打印二叉树
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • C++入门教程(10):for 语句
  • Hexo+码云+git快速搭建免费的静态Blog
  • Javascript Math对象和Date对象常用方法详解
  • js中的正则表达式入门
  • Promise面试题2实现异步串行执行
  • Sublime Text 2/3 绑定Eclipse快捷键
  • windows下使用nginx调试简介
  • Yeoman_Bower_Grunt
  • 阿里云应用高可用服务公测发布
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 浮动相关
  • 高性能JavaScript阅读简记(三)
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 基于webpack 的 vue 多页架构
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 近期前端发展计划
  • 经典排序算法及其 Java 实现
  • 设计模式走一遍---观察者模式
  • 微服务入门【系列视频课程】
  • 为什么要用IPython/Jupyter?
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #Linux(make工具和makefile文件以及makefile语法)
  • (07)Hive——窗口函数详解
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2)STL算法之元素计数
  • (2022 CVPR) Unbiased Teacher v2
  • (35)远程识别(又称无人机识别)(二)
  • (C语言)二分查找 超详细
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (八)Flask之app.route装饰器函数的参数
  • (二)Eureka服务搭建,服务注册,服务发现
  • (南京观海微电子)——I3C协议介绍
  • (转)scrum常见工具列表
  • .NET C# 配置 Options