Javascript中的let和var的详细区别

文章目录

      • 前言
      • var
        • 变量提升
      • let
        • 暂时性死区
      • 具体的区别
        • 声明后未赋值,表现相同
        • 使用未声明的变量,表现不同
        • 重复声明同一个变量时,表现不同
        • 变量作用范围,表现不同

在JavaScript中我们每时每刻都在声明变量、使用变量,在之前我只知道var,后面我发现同事们都在写let,我在半知半解的情况下同时使用了这两种声明方式,结果就报错了。所以在这里写一篇文档来详细说明两种声明方式的区别。

前言

在ES6中JS引入了let,在ES5之前都是使用var进行变量声明。let主要用于声明局部变量。它的用法类似于var,但是ES6也引入了块级作用域的概念,使得let命令所声明的变量只在let命令所在的代码块有效,而且有暂时性死区的约束
那么问题来了。

  • 什么是暂时性死区?
  • 什么是作用域?

var

变量提升

在了解var之前我们首先需要了解一下什么是变量提升。
下面是一道关于var变量提升的题目。

var a=99;
f();
console.log(a);
function f() {console.log(a);var a=10;console.log(a);
}

那么问题来了根据上面的打印输出得到的数据到底是什么呢,我相信很多人在没有了解这个机制之前都会说出是99,10,99之类的,但是实际的结果却是

undefined
10
99

为什么会这样的呢 因为当浏览器开辟出供代码执行的栈内存后,代码并没有自上而下立即执行,而是继续做了一些事情:把当前作用域中所有带var/function关键字的进行提前的声明和定义。所以实际上代码在运行到f()函数内部的时候,并没有先执行console.log,而是先执行了

var a;
//再执行
console.log(a);
//所以此时得到了undefined

接着往后走var a=10;

//此时相当于在定义var a之后给a赋值
var a;
a=10;
console.log(a);

在经过f()函数的局部变量以后,我们来到了全局变量,此时的console.log相当于执行了

var a=99;
console.log(a);

所以这就是变量提升,但是这种机制是非常的反人类的,我们都知道按部就班的执行代码是写出优秀代码的前提,这不仅给出了简洁明了的逻辑,也方便他人阅读,至此ES6,块级作用域的诞生了。

let

在ES6,JavaScript引入了let语法,不同于var声明方式的形式,let声明显得更加的严谨,在var语法中console.log(a); var a=10; 此时会得到undefined,而在let语法中console.log(a); var a=10; 此时会得到Uncaught ReferenceError:Cannot access ‘a’ before initialization,即

未捕获的引用错误:在初始化之前无法访问“a”

暂时性死区

暂时性死区存在于块级作用域,在let、const声明变量之前该变量是不能被使用的。
let、const声明变量时,该变量被绑定在这个块级作用域,不再受外部影响,不被外部访问。
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

在ES6之前,使用typeof运算符永远都是安全的,如何理解呢?就是不管对哪个变量或对象进行类型判断,typeof都是不会报错的,但是在let引入后,typeof也不再安全

typeof x; =>此时会产生ReferenceError
let x;

所以什么是暂时性死区呢,即在let定义的变量之前的块级作用域都属于x的暂时性死区

在ES6之前只有去全局作用域局部作用域的概念,在ES6引入块级作用域的概念后即可通{}来限制作用域。

{var x=10;
}
console.log(x);//输出10
{let x=10;
}
console.log(x);//ReferenceError:x not defined

具体的区别

声明后未赋值,表现相同
function(){var x;let y;console.log(x); //输出undefinedconsole.log(y);//输出undefined
}
使用未声明的变量,表现不同
	console.log(x); //输出undefinedconsole.log(y);//报错ReferenceError:Cannot access ‘y’ before initializationvar x;let y;
重复声明同一个变量时,表现不同
function() {var x1='var first';let y1='let first';var x1='var second';let y1='let second';console.log(x1); //输出var secondconsole.log(y1);//直接报错 Cannot redeclare block-scoped variable 'x1'
}
变量作用范围,表现不同
function(){var x1='var first';let y1='let first';{var x1='var second';let y1='let second';}console.log(x1); //输出var secondconsole.log(y1);//输出let first,因为内部的let定义的x1是在块级作用域中是访问不到的
}

备注:使用 let 语句声明一个变量,该变量的范围限于声明它的块中。 可以在声明变量时为变量赋值,也可以稍后在脚本中给变量赋值。

使用 let 声明的变量,在声明前无法使用,否则将会导致错误。

如果未在 let 语句中初始化您的变量,则将自动为其分配 JavaScript 值 undefined

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/690217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx学习笔记

Bilibili尚硅谷视频 Nginx 简介 Nginx 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,特点是占有内存少,并发能力强,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。 正向代理 正向代理:如…

JavaScript学习记录

JavaScript 是 web 开发人员必须学习的 3 门语言中的一门: HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 以下代码是学习四十分钟JavaScript快速入门做的记录 还可以借鉴JavaScript 教程 // 变量与常量 // let , const // let 变量 //…

【千帆平台】使用千帆大模型平台创建自定义模型调用API,贺岁灵感模型,文本对话

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《千帆平台》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和…

Docker使用操作

文章目录 Docker基本使用1. 安装Docker(简易版)2. docker常用命令3. 镜像基础命令4. 容器操作5. Dockerfile编写 Docker基本使用 环境: python3.11 使用框架 Django 1. 安装Docker(简易版) 卸载旧版本docker(如果存在) sudo apt-get remove docker docker-engine docker-ce d…

镜像管理工具harbor启动在docker中,应该如何重启?

Harbor 是一个用于存储和分发 Docker 镜像的企业级Registry服务器。在 Docker 环境中启动和管理 Harbor 时,您可能需要重启服务来应用更新或配置更改。以下是在 Docker 中重启 Harbor 的步骤: 登录到服务器:首先,您需要通过 SSH 或…

Go 空切片 VS nil切片

在 Go 语言中,空切片和 nil 切片是两种不同的概念。 空切片: 空切片是一个长度和容量都为 0 的切片。你可以通过 make 函数或者切片字面量来创建一个空切片,例如 s : make([]int, 0) 或者 s : []int{}。 空切片不是 nil,即 s !…

神秘物品,从此告别网络焦虑!随身WiFi好用吗?随身WiFi怎么选?

出门在外,网络可是我们的“生命线”。不拿钱包不拿身份证没啥,不拿手机,没有网可是大大的坏事儿。为了一劳永逸的解决我的网络问题,这次我尝试了一款随身WiFi,来简单聊聊我的真实体验感受吧! 一、优点&…

使用php实现pc端和移动端分离

使用php实现pc端和移动端分离 自适应技术可以实现根据浏览器的宽度来实现移动端和pc的自适应,但会影响用户的体验,以下代码实现在同一个链接下,移动端和pc分别有各自的html, $browser get_browser(null, true);// 获取设备宽度$d…

碳化硅模块使用烧结银双面散热DSC封装的优势与实现方法

碳化硅模块使用烧结银双面散热DSC封装的优势与实现方法 新能源车的大多数最先进 (SOTA) 电动汽车的牵引逆变器体积功率密度范围从基于 SSC-IGBT 的逆变器的 <10 kW/L 到基于 SSC-SiC 的逆变器的约 25 kW/L。100 kW/L 代表了这一关键指标的巨大飞跃。 当然&#xff0c;随着新…

嵌入式基础

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/136173662 一.嵌入式系统的组成 1、嵌入式系统是以特定应用为中心、以计算机技术为基础&#xff0c;并将可配置与可裁剪的软、硬件集成于一体的专用计算机系统。 2、嵌入式系统的组成结构是&#xff…

热辣滚烫--如何让PCB上的固定螺丝孔沉下去

高速先生成员--王辉东 龙腾盛世,岁月如歌。祝大家开工大吉&#xff0c;热辣滚烫&#xff0c;红红火火,新的征程已然拉开帷幕。 林如烟和赵理工常听大师兄说&#xff0c;最近几年随着国内芯片行业的快速崛起&#xff0c;ATE工装治具和测试板的需求持续增大&#xff0c;由于芯片…

深入了解Linux /etc/passwd文件

在Linux系统中&#xff0c;/etc/passwd 文件是一个重要的系统文件&#xff0c;记录了系统上所有用户的基本信息。通过查看这个文件&#xff0c;我们可以获取用户的用户名、用户ID&#xff08;UID&#xff09;、组ID&#xff08;GID&#xff09;、用户描述、家目录以及默认的She…

聊聊PowerJob的CleanService

序 本文主要研究一下PowerJob的CleanService CleanServiceSlf4jServicepublic class CleanService { private final DFsService dFsService;private final InstanceInfoRepository instanceInfoRepository;private final WorkflowInstanceInfoRepository workflowInstanceIn…

七、计算机视觉-图像的ROI区域

文章目录 1、什么是ROI2、ROI如何实现的3、一个案例总结 1、什么是ROI 在计算机视觉中&#xff0c;ROI代表感兴趣区域&#xff08;Region of Interest&#xff09;&#xff0c;它是指图像或视频中被指定为需要特别关注或处理的区域。ROI可以帮助减少计算量&#xff0c;并且在处…

TrueNAS磁盘扩容(VDEV 和 RAID 技术)

目录 背景扩容前准备扩容有风险安装新的硬盘到卡槽扩容测试一个VDEV两个VDEV 正式扩容关于Raid总结 背景 这几天将原来windows服务器上的文件拷贝到新做好的TrueNAS上&#xff0c;发现磁盘满了&#xff0c;服务器上还有硬盘卡槽&#xff0c;就新买了12块盘&#xff0c;准备扩容…

中国留学生被“虚拟绑架”?AI让电信诈骗更加逼真,我们该怎么识别?

目录 AI让电信诈骗如虎添翼 如何防范冒充熟人的电信欺诈&#xff1f; 近日&#xff0c;一起针对海外留学生群体的新型电信网络诈骗案引发关注。中国驻美国使馆发言人证实&#xff0c;一名疑似遭绑架的中国留学生实际上遭遇了“虚拟绑架”诈骗。 诈骗分子冒充公检法机关、使馆、…

vue通过获取url中的信息登录页面

在主界面获取到url的信息 html <script>let getRequest function () {var url location.href// 从 URL 中提取查询参数部分const queryParamsString url.split(?)[1];// 使用 URLSearchParams 解析查询参数const queryParams new URLSearchParams(queryParamsStrin…

涛哥聊Python | borb,一个好用的 Python 库,处理 PDF 文件好帮手!

本文来源公众号“涛哥聊Python”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;borb&#xff0c;一个好用的 Python 库&#xff01; 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - borb。 Github地址&#xff1a;htt…

Java初探:从入门到上手应用,一路向前的全面指南!

Java初探&#xff1a;从入门到上手应用&#xff0c;一路向前的全面指南&#xff01; 引言 欢迎来到这篇关于Java编程语言的博客&#xff01;Java是一门广泛应用于软件开发领域的高级编程语言&#xff0c;其设计初衷是为了实现一次编写&#xff0c;到处运行的目标。本文将带领你…

Willem, Chtholly and Seniorious(珂朵莉树)

小时候听说过珂朵莉树的大名&#xff0c;奈何当时没有专业知识看不懂。最近正好想起来了&#xff0c;来补上这个遗憾。 珂朵莉树&#xff08;Chtholly Tree&#xff09;又叫老司机树&#xff08;ODT&#xff0c;Old Driver Tree&#xff09;。多年前&#xff0c;一位用户 Old …