广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详细解析let和const命令
  • 236
分享到

详细解析let和const命令

2024-04-02 19:04:59 236人浏览 薄情痞子
摘要

目录let命令基本用法特性暂时性死区不允许重复声明const特性补充——块级作用域let命令 基本用法 我们都知道let命令是用来声明变量的,类似于var,但

let命令

基本用法

我们都知道let命令是用来声明变量的,类似于var,但是通过let命令声明的变量只在所在代码块内有效。

let a = [];
for (let i = 0;i < 10; i++ ) {
    a[i] = function () {
        console.log(i);
    }
}
a[5](); // 5

如上代码所示,使用的是let声明的i,那么这个变量仅在块级作用域内有效,即只在每轮循环内有效,所以每次循环的i其实都是一个新变量,所以最后输出了5。

如果使用了var去申明i,那么这个i是在全局范围内都有效的,函数数组里的i都会指向同一个i,导出最后输出的是最后一轮循环的i的值。

那就有了一个疑问,使用let声明的i如果每一轮都是一个新变量,那怎么知道上一轮循环的值然后计算出本轮的值?

这是因为javascript引擎内部会记住上一轮循环的值,初始化当次循环的i时,会在上一轮循环的基础上计算。

for循环还有一个特别的地方,就是设置循环变量的括号内是一个父作用域,而循环体内是一个单独的子作用域。

特性

不存在变量提升:

不存在变量提升我们应该都知道,在var命令中会发生“变量提升”,就是变量可以在声明之前使用,而值是undefined。这种是比较奇怪的现象,因为他都还没声明怎么就可以使用呢?

所以。let命令改变了这种语法,通过let声明的变量一定要在变量声明后才能用,不然就会报错。

console.log(b) // undefined
console.log(a) // 报错ReferenceError
let a = 2;
var b = 1;

暂时性死区

只要块级作用域内存在Let命令,那么这个let声明的变量就绑定了这个区域,不会受到外部的影响。

var num = 1;
if(true) {
    num = 2; // 报错,ReferenceError
    let num;
}

如上面代码所示,if代码块内想要修改的是if外部的num,但是if内部通过let声明了一个num但为赋值,所以导致了通过let声明的num绑定了这个块级作用域(即if内部这个块级作用域),所以不会受到外部的num影响,所以对num赋值会报错。

es6明确规定了,如果在区块内存在let和const命令,那么这个区块对这些命令声明的变量从一开始就形成封闭的作用域,只要在声明之前就使用这些变量,就会报做。也称暂时性死区(temporal dead zone,简称TDZ)

当然,这也造成了typeof变得不安全了,因为如果一个变量没有声明就使用typeof不会报错,会返回一个undefined,但是现在不成立了,因为会报错ReferenceError。

function bar(x = y, y = 2) {
    return[x,y] 
}
bar() // 报错

如上代码所示,调用bar函数会报错,因为参数x的默认值等于另一个参数y,但是x在声明的时候y还没有声明,属于死区

总之,只要进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

其实let和const是存在变量提升的,但是由于暂时性死区的关系,变量已经存在了,但是不可获取,要等到声明变量的时候才可以获取和使用。

不允许重复声明

let不允许在校内共同作用域内重复声明同一个变量,这个就不用说了大家都知道。

let a = 1;
let a = 2; // 报错

const

我们都知道const声明一个只读的常量。修改这个值就会报错。但是实际上保证的不是变量的值不能改动,而是变量指向的那个内存地址不能改动。

对于简单数据类型来说,值就是保存在变量指向的内存地址中,因此等同于常量。

而对于复合类型的数据,变量指向的内存地址保存的是一个指针,const只保证指针是固定,不保证内部的结构是不是可变的。

    // 给对象添加一个属性
    const foo = {}
    foo.name = 123
    console.log(foo.name) // 123
    // 将foo指向另一个对象,就会报错
    foo = {} // 报错。

如果想要将对象冻结,可以使用Object.freeze

const foo = Object.freeze({});

特性

  • 只在声明所在的块级作用域内有效。
  • const声明的常量不会提升,同样存在暂时性死区,只能在声明后使用。
  • 不可重复声明。

补充——块级作用域

函数能不能在块级作用域中声明呢?

ES5中是规定函数只能在顶级作用域和函数作用域之中声明,不能在块级作用域声明。

ES6中引入了块级作用域,明确允许在块级作用域之中声明函数。而且。函数声明的语句的行为类似于let,在块级作用域之外不可引用。

function f() {
    console.log('I am outside!')
}
(function() {
    if(false) {
        function f() {
            console.log('I am inside')
        }
    }
}
f();
}())

上面的代码,在es5中运行时会得到I am inside!,因为if内部的f函数会被提升到函数头部。

但是在ES6环境则会报错,为什么呢?

因为游览器的实现有自己的方式:

  • 允许在块级作用域内声明函数
  • 函数声明类似于var,会提升到全局作用域或函数作用域的头部
  • 函数声明还会提升到所在的块级作用域的头部

所以上述代码实际在ES6的游览器中会生成这样的代码:

  function f() {
    console.log("I am outside!");
  }
  (function () {
    var f = undefined;
    if (false) {
      function f() {
        console.log("I am inside");
      }
    }
  })();

因此,应该避免在块级作用域内声明函数,如果确定需要写成函数表达式的形式,而不是函数声明语句。

到此这篇关于详细解析let和const命令的文章就介绍到这了,更多相关let和const内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详细解析let和const命令

本文链接: https://www.lsjlt.com/news/152542.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详细解析let和const命令
    目录let命令基本用法特性暂时性死区不允许重复声明const特性补充——块级作用域let命令 基本用法 我们都知道let命令是用来声明变量的,类似于var,但...
    99+
    2022-11-13
  • ES6的let和const命令怎么用
    今天小编给大家分享一下ES6的let和const命令怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. let 命令①...
    99+
    2023-06-17
  • javascript的let和const命令怎么使用
    本篇内容介绍了“javascript的let和const命令怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!let命令基本用法我们都知...
    99+
    2023-07-02
  • ES6中let和const命令有什么用
    这篇文章将为大家详细讲解有关ES6中let和const命令有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言在javascript中,我们都知道使用var来声明变...
    99+
    2022-10-19
  • ES6新特性之let和const命令的示例分析
    这篇文章主要介绍了ES6新特性之let和const命令的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:1. let 命令①...
    99+
    2022-10-19
  • 详细解析命令行的getopt_long()函数
    头文件 #include<getopt.h> 函数原型int getopt_long(int argc,char * const argv[],const char *o...
    99+
    2022-11-15
    getopt_long
  • top命令详细解读
    top命令详细解读 1.top命令介绍2.top命令输出结果分析2.2 进程信息 3.top命令行选项4.top交互命令5. VIRT、RES、SHR含义 1.top命令介绍 top命令是Linux系统中常用的性能分析工具,...
    99+
    2023-08-20
    linux 服务器 运维
  • linux命令ifconfig的详细解释
    这篇文章主要讲解了“linux命令ifconfig的详细解释”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux命令ifconfig的详细解释”吧!许多...
    99+
    2022-10-18
  • dword ptr指令详细解析
    对于这个问题,汇编语言中用一下方法处理。 (1)通过寄存器名指明要处理的数据的尺寸。例如:下面的指令中,寄存器指明了指令进行的是字操作:mov ax,1mov bx,ds:[0]mo...
    99+
    2022-11-15
    dword_ptr
  • linux下修改文件权限chmod命令详细解析
    使用 linux 的chmod命令控制谁可以访问读写或运行目标文件。 在 Linux 中,谁可以对文件或目录做什么是通过一系列权限来控制的。 权限可以控制对文件或目录执行的操作(读写或执行)。 我们可以使用-l(长格式)...
    99+
    2022-06-04
    Linux文件权限chmod命令 chmod修改文件权限命令
  • C语言中auto,register,static,const,volatile的区别详细解析
    1)auto这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变...
    99+
    2022-11-15
    register static const volatile
  • linux下的tar命令详细解释
    tar命令 [root@Linux ~]# tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思); -x :解开一个压缩文件的参数指...
    99+
    2022-06-04
    命令 详细 linux
  • linux命令scp和sftp详细介绍
    linux命令scp和sftp详细介绍 1. 使用 scp 命令传输文件: 使用 scp 命令可以用来通过安全、加密的连接在不同主机之间传输文件。 (1)把本地文件传输到远程主机: 一般语法:scp [本地...
    99+
    2022-06-04
    详细介绍 命令 linux
  • Python命令行解析器argparse详解
    目录第1章 argparse简介1.1 解析1.2 argparse定义三步骤1.3  代码示例第2章 参数详解2.1 创建一个命令行解析器对象:ArgumentParse...
    99+
    2022-11-12
  • Linux 系统 grep 命令超详细讲解
    grep命令是Linux系统中非常常用的搜索命令,用于在文件中查找指定的字符串。下面是grep命令的详细讲解:基本语法:grep [...
    99+
    2023-09-15
    Linux
  • 命令执行漏洞超详细讲解
    💕💕💕 博主昵称:摆烂阳💕💕💕 🥰博主主页跳转链接 👩‍...
    99+
    2023-08-31
    服务器 网络 安全
  • C语言详细分析讲解关键字const与volatile的用法
    目录一、const 只读变量二、const 全局变量的分歧三、const 的本质四、const 修饰函数参数和返回值五、volatile 解析六、小结一、const 只读变量 con...
    99+
    2022-11-13
  • 详解Python命令行解析工具Argparse
    最近在研究pathon的命令行解析工具,argparse,它是Python标准库中推荐使用的编写命令行程序的工具。 以前老是做UI程序,今天试了下命令行程序,感觉相当好,不用再花大把时间去研究界面问题,尤其...
    99+
    2022-06-04
    命令行 详解 工具
  • Linux最狠命令sudo rm -rf /* 详细解释
    sudo rm -rf /*是使用管理员(root)权限删除电脑中的一切东西(包括可移动设备中的文件) 接下来,我们把这条命令拆分开解释一下 sudo是使用管理员(root)权限执行命令,在命令前加sudo会要求输入root密码,由于Lin...
    99+
    2023-09-01
    linux 运维 服务器
  • Redisexists命令bug分析(案例详解)
    目录1、复现条件版本:2、源码分析3、问题解决本文基于社区版Redis 4.0.8 1、复现条件版本: 社区版Redis 4.0.10以下版本使用场景:开启读写分离的主从架构或者集群...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作