当前位置:网站首页>ES6 let 和 const 命令
ES6 let 和 const 命令
2022-07-06 09:14:00 【imxlw00】
let 基本用法
let命令,用来声明变量。它的用法类似于var
let a = 10;
var b = 1;
不存在变量提升
var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
暂时性死区
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
不允许重复声明
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
块级作用域
{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined.
b // 1
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}
上面的函数有两个代码块,都声明了变量n,运行后输出 5。这表示外层代码块不受内层代码块的影响。如果两次都使用var定义变量n,最后输出的值才是 10。
const命令基本用法
const声明一个只读的常量。一旦声明,常量的值就不能改变。
<script type="text/javascript">
const PI = 3.1415;
console.log(PI); // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
</script>
const的作用域与let命令相同:只在声明所在的块级作用域内有效。
const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
const命令本质
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
const foo = {
};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {
}; // TypeError: "foo" is read-only
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // 报错
顶层对象的属性
在浏览器环境指的是window对象
window.a = 1;
a // 1
a = 2;
window.a // 2
ES6 为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
var a = 1;
// 如果在 Node 的 REPL 环境,可以写成 global.a
// 或者采用通用方法,写成 this.a
window.a // 1
let b = 1;
window.b // undefined
上面代码中,全局变量a由var命令声明,所以它是顶层对象的属性;全局变量b由let命令声明,所以它不是顶层对象的属性,返回undefined。
边栏推荐
- 02 staff information management after the actual project
- AcWing 1298.曹冲养猪 题解
- Basic use of redis
- Windows下安装MongDB教程、Redis教程
- Postman uses scripts to modify the values of environment variables
- double转int精度丢失问题
- Armv8-a programming guide MMU (2)
- JDBC principle
- L2-006 树的遍历 (25 分)
- Deoldify project problem - omp:error 15:initializing libiomp5md dll,but found libiomp5md. dll already initialized.
猜你喜欢
【博主推荐】SSM框架的后台管理系统(附源码)
Data dictionary in C #
Machine learning notes week02 convolutional neural network
Pytorch基础
Idea import / export settings file
AI benchmark V5 ranking
LeetCode #461 汉明距离
Picture coloring project - deoldify
[Thesis Writing] how to write function description of jsp online examination system
[recommended by bloggers] C MVC list realizes the function of adding, deleting, modifying, checking, importing and exporting curves (with source code)
随机推荐
机器学习笔记-Week02-卷积神经网络
Ansible实战系列三 _ task常用命令
AI benchmark V5 ranking
数数字游戏
AcWing 179.阶乘分解 题解
QT creator design user interface
记一次某公司面试题:合并有序数组
[download app for free]ineukernel OCR image data recognition and acquisition principle and product application
【博主推荐】SSM框架的后台管理系统(附源码)
【博主推荐】asp.net WebService 后台数据API JSON(附源码)
CSDN markdown editor
Swagger, Yapi interface management service_ SE
[蓝桥杯2017初赛]方格分割
机器学习--人口普查数据分析
Copie maître - esclave MySQL, séparation lecture - écriture
Some notes of MySQL
L2-007 家庭房产 (25 分)
Principes JDBC
QT creator create button
Dotnet replaces asp Net core's underlying communication is the IPC Library of named pipes