一文读懂JS中的var/let/const和暂时性死区

一文读懂JS中的var/let/const和暂时性死区

在 JavaScript 中,变量声明语句有三种:var、let 和 const。除此之外,ES6 引入了新的概念——暂时性死区。

var

var 是 ES5 中引入的声明变量的关键字,它的作用域是函数作用域或全局作用域。使用 var 声明的变量可以在函数内部或全局范围内访问(也可以在任意位置声明,在函数内部则会被规范提升至函数的最上方)。

function func() {
  console.log(a); // undefined
  var a = 1;
  console.log(a); // 1
}
func();

注意:如果同一函数中出现重复的 var 声明,后面的会覆盖前面的。

function func() {
  var a = 1;
  var a = 2;
  console.log(a); // 2
}
func();

let

ES6 引入了 let 声明变量的关键字,它也是用来声明变量的,但它的作用域是块级作用域。块级作用域可以理解为在一次“{}”内定义的变量,只能在大括号内或子大括号内访问。

function func() {
  console.log(a); // ReferenceError: a is not defined
  let a = 1;
  console.log(a); // 1
}

使用 let 声明的变量只能在其作用域内访问,包括 { } 作用域内。另外,同一作用域不能出现重复的 let 声明,否则会抛出 SyntaxError 异常。

function func() {
  let x = 1;
  if (x === 1) {
    let x = 2; // 不会影响外部 x 的值
    console.log(x); // 2
  }
  console.log(x); // 1(外部 x 仍然等于 1)
}
func();

const

const 也是 ES6 中引入的声明变量的关键字,只不过用于声明一个只读的常量。它的作用范围和 let 类似,同样是块级作用域。

function func() {
  const MAX_COUNT = 10;
  MAX_COUNT = 20; // TypeError: Assignment to constant variable.
  console.log(MAX_COUNT); // 10
}
func();

使用 const 声明的常量在声明后不能被重新赋值,否则会抛出 TypeError 异常。

暂时性死区

letconst 被引入到 JavaScript 中,就存在一个概念叫做暂时性死区。它指的是在代码块中使用 letconst 声明变量时,在变量声明前使用该变量会抛出 ReferenceError 异常。

function func() {
  console.log(a); // ReferenceError: a is not defined
  let a = 1;
  console.log(a); // 1
}
func();

同样地,也适用于用 const 声明变量的情况:

function func() {
  const a = 1;
  console.log(a); // 1
  if (true) {
    console.log(a); // 1
    const a = 2; // ReferenceError: Cannot access 'a' before initialization
  }
}
func();

在上述例子中,当控制流进入 if 语句块时,const a = 2 的声明将重写外部变量的值,因此在这里使用 console.log(a) 会抛出 ReferenceError 异常。

总之,对于使用 letconst 声明的变量,必须理解暂时性死区的概念,避免程序出现异常。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文读懂JS中的var/let/const和暂时性死区 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • react-router JS 控制路由跳转实例

    下面我将为您详细讲解”react-router JS 控制路由跳转实例”的攻略步骤。 步骤一:安装react-router 在项目中安装react-router-dom依赖包,react-router-dom是基于React的DOM封装,提供了一些跟浏览器url地址相关的组件。 npm install react-router-dom –save 步骤二:…

    JavaScript 2023年6月11日
    00
  • asp javascript在线管理

    下面我将为您详细讲解“ASP Javascript在线管理”的攻略。 什么是“ASP Javascript在线管理”? “ASP Javascript在线管理”是一种基于ASP(Active Server Pages)技术和Javascript脚本语言实现的在线管理系统。它可以让用户通过网页界面对服务器上的文件进行管理和操作,比如上传文件、创建文件夹、删除文…

    JavaScript 2023年6月10日
    00
  • js使用i18n实现页面国际化的方法

    实现页面国际化(Internationalization,简称i18n)的方法在前端开发中非常常见,可以让我们的网站更易于被全球用户理解和使用。下面我将详细讲解如何使用JavaScript实现网站的i18n。 1. 建立语言包 首先,我们需要建立站点所需的多语言文字资源。针对不同语言,我们可以分别建立不同的语言包(language pack),其中保存着相应…

    JavaScript 2023年5月19日
    00
  • javascript Window及document对象详细整理

    JavaScript Window及Document对象详细整理 在 JavaScript 中,Window 和 Document 是两个常用的对象,它们分别代表浏览器窗口和文档模型。本文将详细讲解它们的各种属性和方法。 Window 对象 Window 对象是 JavaScript 代码的全局对象,即在浏览器中,它代表整个浏览器窗口。在没有指定父窗口的情况…

    JavaScript 2023年5月27日
    00
  • Java 面试题和答案 -(上)

    让我详细讲解一下“Java 面试题和答案 -(上)”的完整攻略。 标题 首先,我们需要为文章设置一个标题。根据文章内容,我建议将标题设置为“Java 面试题和答案 -(上)完整攻略”。 内容 接下来,我们可以按照以下步骤来编写文章内容: 介绍Java面试题的重要性以及面试的基本流程。 列举10道常见的Java面试题,此处不仅需要列举问题,也需要对每个问题进行…

    JavaScript 2023年5月28日
    00
  • 小程序异步问题之多个网络请求依次执行并依次收集请求结果

    当小程序中需要同时发起多个网络请求,并且这些网络请求需要按顺序执行,每个请求执行完成后需要依次收集请求结果时,就需要解决小程序的异步问题。 下面是实现多个网络请求依次执行并依次收集请求结果的完整攻略: 方法一:Promise + async/await 使用Promise.all方法,将需要按顺序执行的请求封装成Promise对象,传入Promise.all…

    JavaScript 2023年6月11日
    00
  • Java老手该当心的13个错误

    Java老手该当心的13个错误攻略 Java老手,往往会认为自己已经掌握了Java的特性和语法规则,然而在实际开发过程中,还是容易犯一些错误。本文将列举Java老手容易犯的13个错误,并给出具体的解决方案。 错误1:变量作用域 变量的作用域需要慎重考虑,特别是在使用匿名内部类时,很容易犯下这个错误。在使用匿名内部类时,一定要注意它对当前环境中变量的引用。示例…

    JavaScript 2023年5月28日
    00
  • JavaScript基础语法之js表达式

    让我们一起来详细讲解一下“JavaScript基础语法之js表达式”的完整攻略。 什么是JavaScript表达式? JavaScript表达式是JavaScript中计算值的一种方法。表达式可以是简单的数学计算、变量、函数调用,或者由运算符和操作数组成的复杂语句。在JavaScript中,任何使用分号(;)结尾的操作都是表达式。 在JavaScript中,…

    JavaScript 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部