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

yizhihongxing

一文读懂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日

相关文章

  • js实现的在本地预览图片功能示例

    “js实现的在本地预览图片功能”的攻略如下: 1. 了解FileReader API JavaScript中的FileReader API可以让我们在浏览器中读取文件,包括图片等二进制文件。该API中最常用的方法是readAsDataURL(),用于读取指定文件并将其转换为Data URL格式,以便在HTML <img>元素中进行显示。 以下是一…

    JavaScript 2023年6月11日
    00
  • 用move.js库实现百叶窗特效

    使用move.js库实现百叶窗特效可以通过以下步骤进行操作: 1. 引入move.js库 在 HTML 文件头部添加以下代码来引入 move.js 库: <script src="https://cdn.bootcdn.net/ajax/libs/move.js/0.5.3/move.min.js"></script&g…

    JavaScript 2023年6月10日
    00
  • js 中{},[]中括号,大括号使用详解

    下面我来详细讲解一下 JS 中 {}、[] 中括号、大括号使用的详细攻略。 大括号 {} 大括号 {} 在 JS 中主要用于表示一个代码块,可以将多条语句组合在一起,在循环、条件语句、对象字面量等场景下经常使用。 下面是一个将数组中的奇偶数分离的示例: const arr = [1, 2, 3, 4, 5, 6]; const even = []; cons…

    JavaScript 2023年5月27日
    00
  • JavaScript起点(严格模式深度了解)

    JavaScript起点(严格模式深度了解) 什么是严格模式? 严格模式是 ECMAScript 5 引入的一种运行模式,主要作用是弥补了 JavaScript 语言本身一些缺陷,提高了代码的运行效率,增强了安全性。通过开启严格模式,可以使 JavaScript 代码更加规范、更加安全、更加高效。 开启严格模式有两种方式: 在全局环境中使用 ‘use str…

    JavaScript 2023年5月19日
    00
  • vue开发利器之unplugin-auto-import的使用

    vue开发利器之unplugin-auto-import的使用 什么是unplugin-auto-import unplugin-auto-import是一个插件,它可以在你编写Vue代码的时候自动向代码中导入需要的Vue或者JS依赖。 它可以自动跟踪依赖并导入所需的内容,避免了手动导入的繁琐步骤,提高了开发效率。 如何使用unplugin-auto-imp…

    JavaScript 2023年6月11日
    00
  • javascript将浮点数转换成整数的三个方法

    当我们在Javascript开发中需要将浮点数转换成整数时,通常有以下三种方法: 1. 使用parseInt函数 let num = 3.14159; let integer = parseInt(num); console.log(integer); // 3 这种方法使用parseInt函数将浮点数先转换成字符串,然后再将字符串转换成整数,通过截取小数点…

    JavaScript 2023年6月10日
    00
  • Javascript中async与await的捕捉错误详解

    Javascript中async与await的捕捉错误详解 异步编程 在Javascript中,异步编程常常用于处理一些耗时的操作,例如读取服务器数据、文件读取或者用户输入等。 常见的异步编程方法有: 回调函数 Promise async/await 在这三种方法中,回调函数是最早被广泛采用的一种方式,它的另一种形式是事件监听器。然而,回调函数很容易出现回调…

    JavaScript 2023年5月18日
    00
  • JavaScript实现浏览器网页自动滚动并点击的示例代码

    JavaScript实现浏览器网页自动滚动并点击的示例代码,可以通过以下步骤完成: 创建一个HTML页面,添加一个button按钮和一个div元素: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>自动滚动并…

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