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

相关文章

  • JS数组Reduce方法功能与用法实例详解

    JS数组Reduce方法功能与用法实例详解 简介 JavaScript中的Array对象提供了许多有用的方法,其中之一是Reduce()方法。Reduce()方法用于迭代数组中的所有元素,将它们累加到一个单一的返回值中。Reduce()方法提供了一个非常方便且灵活的方式来执行数组元素的计算和聚合操作。 语法 Reduce()方法的语法如下所示: arr.re…

    JavaScript 2023年5月27日
    00
  • JS中字符串trim()使用示例

    JS中字符串trim()使用示例 简介 trim() 方法用于删除字符串的头尾空白符(包括空格、制表符、换行符等等),返回值是一个新的字符串。trim() 方法不改变原始字符串。 用法 语法: stringObject.trim() 示例1 – 去除字符串头尾空格 下面这段代码演示了如何使用trim()方法去掉字符串头尾的空格: let str1 = &qu…

    JavaScript 2023年5月28日
    00
  • 简单实用的js调试logger组件实现代码

    针对“简单实用的js调试logger组件实现代码”的完整攻略,我将从以下几个部分进行讲解: 调试logger组件简介 实现步骤 示例说明:如何在项目中使用调试logger组件 示例说明:如何在浏览器控制台输出调试信息 接下来我将逐一讲解。 1. 调试logger组件简介 调试logger组件是一种常用的js调试工具,可以在开发过程中方便地输出调试信息,帮助我…

    JavaScript 2023年5月28日
    00
  • javascript常用正则表达式合集

    JavaScript常用正则表达式合集 正则表达式是一种强大的字符串匹配工具,可以在文本中找到特定的模式并进行替换、删除或提取操作。JavaScript常用正则表达式合集就是收集了一些在JavaScript中常见的正则表达式,让我们能够更加高效地应用正则表达式。 匹配数字 匹配数字的正则表达式可以用于验证表单中的数字输入是否合法,或者将文本中的数字提取出来作…

    JavaScript 2023年5月19日
    00
  • ajax请求get与post的区别总结

    针对“ajax请求get与post的区别总结”,建议分以下几个部分详细讲解: 一、什么是Ajax? Ajax(Asynchronous JavaScript And XML)指的是一种用于在Web页中实现异步请求的技术,在不刷新整个页面的情况下对页面的局部进行更新。简单来说,使用Ajax可以让前端通过异步的方式与后端进行交互和数据传输。 二、get和post…

    JavaScript 2023年6月11日
    00
  • 原生JavaScript实现刮刮乐

    关于“原生JavaScript实现刮刮乐”的攻略,我们可以按照以下步骤进行。 1. 准备工作 首先,我们需要在HTML文件中创建一个canvas元素,用于绘制刮去涂层后的图片。示例代码如下: <canvas id="scratch-card"></canvas> 接下来,我们需要准备两张图片。一张作为底部图片,一张…

    JavaScript 2023年6月10日
    00
  • jquery对象和javascript对象即DOM对象相互转换

    将jQuery对象转换为DOM对象可以使用get()或[index]方法,将DOM对象转换成jQuery对象可以使用$()或jQuery()方法进行转换。 示例1:将jQuery对象转换成DOM对象 // 创建jQuery对象 var $elem = $(‘<div>’, {text: ‘Hello World!’}); // 将jQuery对象…

    JavaScript 2023年5月27日
    00
  • JS+Canvas绘制抽奖转盘

    下面是详细讲解“JS+Canvas绘制抽奖转盘”的完整攻略: 一、准备工作 创建 HTML 文件并引入 Canvas(例如:) 获取 Canvas 对象,创建绘图上下文和 Canvas 尺寸 定义需要用到的变量(例如:奖项,概率,角度,旋转速度等) 二、绘制转盘基本结构和奖项 绘制转盘外圆和内圆 绘制奖项扇形,并填充不同的颜色 三、转盘动画 绑定旋转事件(例…

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