let命令

块级作用域

ES6新增了let命令,用于声明变量,其用法类似于var,但是所声明的变量只在let命令所在的代码块内有效
       像上面例子,var声明的i是全局的,全局只有一个i,所以会输出i的最后的结果10,而let声明的i是仅在块级作用域中有效,所以输出的是6

不存在变量提升

var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则便会报错。

暂时性死区

只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响在代码块内,使用let命令声明变量之前,这些变量都是不可用的
       暂时性死区的本质就是,只要进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量

不允许重复声明

let不允许在相同作用域内重复声明同一个变量

块级作用域

什么是块级作用域

任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域

为什么要有块级作用域

ES5中只有函数作用域和全局作用域,没有块级作用域,这会导致一些场景不合适

变量非预期的重复覆盖


       因为判断里的tmp变量提升,所以覆盖掉了第一个tmp的值,导致第一个输出是undefined

用于循环计数的变量泄露为全局变量


       很多情况下,像这样的i,开发者只是定义用来控制循环,循环结束后却并没有消失,而是泄露为了全局的变量

ES6的块级作用域

之前ES5中我们需要实现类似块级作用域的效果是使用立即执行函数
       ES6中,let实际上为js新增了块级作用域,使得立即执行函数不再必要了。

const命令

const声明一个只读的常量,一旦声明,常量的值就不能改变,因为const声明的变量不得改变值。这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
       const的作用域与let命令相同:只在声明所在的块级作用域内有效,const命令声明的常量也不会提升,同样存在暂时性死区,只能在声明后使用。使用const声明常量也与let一样,不可重复声明。

栈内存和堆内存

为什么这里突然要介绍栈内存和堆内存呢,这和后面将要介绍的const命令的本质有关。
       javaScript中的变量分为基本类型和引用类型。
       基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问
       引用类型是保存在堆内存中的对象,值大小不固定,栈内存中存放的该对象的访问地址指向堆内存中的对象,js不允许直接访问堆内存中的位置

const的本质

const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。但对于复合类型的数据而言,变量指向的内存地址保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,这完全不能控制。因此,将一个对象声明为常量时必须非常小心。也就是说对象常量不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,依然可以为其添加新属性
       如果真的想将对象冻结,应该使用Object.freeze方法

小伙伴们今天的学习就到这里了,如果觉得本文对你有帮助的话,欢迎转发,评论,收藏,点赞!!!
       每天学习进步一点点,就是领先的开始。如果想继续提高,欢迎关注我,或者关注公众号”祯民讲前端“。大量前端技术文章,面试资料,技巧等助你更进一步!

js使用const的好处_let和const命令相关推荐

  1. JS红书宝--var,let和const声明变量

    var,let和const声明变量 var 声明 var声明作用域 function test() { var message = "hi"; // 局部变量 } test(); ...

  2. 让我们探索Cycle.js和Model-View-Intent的好处

    by Fabio Hiroki 由Fabio Hiroki 让我们探索Cycle.js和Model-View-Intent的好处 (Let's explore the benefits of Cycl ...

  3. 2020-09-21C++学习笔记之与C语言区别和加强——四种const意义(const int a; int const b; const int *c; int * const d)

    2020-09-21C++学习笔记(const int a; int const b; const int *c; int * const d) 这两天在上课更新晚了. 1.C/C++中的const ...

  4. C++之const类成员变量,const成员函数

    const修饰类的成员函数 const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当co ...

  5. 【C 语言】const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )

    文章目录 一.const 普通用法 二.常量指针 ( 指向 常量 的指针 | 被指向的内存不能被修改 ) 三.指针常量 ( 指针不能被修改 ) 三.指向 常量 的 指针常量 四.const 在 * 左 ...

  6. c语言常量的正确表示const,C语言中的const和free用法详解

    注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候.如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件.因为,两个编译器会有差别的. 一.C语言中的 ...

  7. const char * array[]和char * const array[]

    int main() {char abc[] = "abc";char def[] = "def";char * const array[] = {" ...

  8. html框架有什么作用,使用HTML5+CSS+JS框架有那些好处

    使用HTML5+CSS+JS框架有那些好处 2017-12-08 相信很多程序猿朋友都用过框架,不过你是否知道你用的是HTML框架.CSS框架还是JS框架,其实这都不重要,重要的是使用框架的目的是什么 ...

  9. const int *a和int*const a 的区别详解

    补充知识 "const int i"与"int const i"之间的区别 对变量来说,const 关键字可以限定一个变量的值不允许改变,从而保护被修饰的东西, ...

最新文章

  1. c#百度排名点击器编写 及webser 填表.
  2. 分布式事务,阿里为什么钟爱TCC
  3. 在Elasticsearch中查询Term Vectors词条向量信息
  4. [C++基础]025_虚函数和虚函数表
  5. 三层神经网络实现手写数字的识别(基于tensorflow)
  6. Linux性能优化实战:应用的CPU使用率100%,我该怎么办(05)
  7. 3.30作业(采购管理+信息管理)
  8. CAD中把样条曲线改成多线段
  9. 细节至上——Splus微博设计之界面篇(转)
  10. java调用百度语音接口
  11. css border-image 图片边框
  12. 计算机输入什么指令关机,电脑关机命令是什么 电脑关机命令详解
  13. 微信 html5 声音,Html5-video ,播放视频有声音无画面(微信H5页面)
  14. 第二章 复杂的HTML解析(上)
  15. 《当下的启蒙》的概述和精华
  16. node.js邮箱验证码
  17. 贴片电容COG、NPO 、X7R、X5R、Y5V介质区别
  18. React中antd日期选择框,指定区间禁用时间
  19. 一个有用的视频播放器VLC
  20. 费希尔阀门定位器DVC6200的调试

热门文章

  1. power接口 sata_sata硬盘不接power接口读的出来吗
  2. python什么是堆什么是栈_python中堆和栈_Python小知识00002
  3. mysql 压缩备份_备份压缩mysql 数据库
  4. android php实时聊天工具,Android_Android 应用APP加入聊天功能,简介 自去年 LeanCloud 发布实时 - phpStudy...
  5. rabbitmq消息保证幂等的消息设计
  6. (转)Clang 比 GCC 编译器好在哪里?
  7. python_线程读写操作一
  8. django准备 —环境配置,及其虚拟环境安装、django安装、数据库安装、新建项目...
  9. Layui导航、面包屑
  10. [GO]无缓冲通道(unbuffered channel)