《02》let 和 const 命令
目录
1.let命令
基本用法
暂时性死区
不允许重复声明
2.块级作用域
3.const 命令
基本用法
本质
1.let命令
基本用法
ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>let基础用法</title>
</head>
<body><script>{let a=1;var b=2;}console.log("变量a:"+a)//未定义console.log("变量b:"+b)//2</script>
</body>
</html>
上面代码在代码块之中,分别用let和var声明了两个变量。然后在代码块之外调用这两个变量,结果
let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。
for循环的计数器,就很合适使用let命令。
for(let i=0; i<10; i++){
}
console.log("变量i"+i)//Uncaught ReferenceError: i is not defined
上面代码中,计数器i只在for循环体内有效,在循环体外引用就会报错。
下面的代码如果使用var,最后输出的是10。
var a=[];
for(var i=0; i<10; i++){a[i]=function(){console.log(i);}
}
a[6]();//10
上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
暂时性死区
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
if (true) {// TDZ开始tmp = 'abc'; // ReferenceErrorconsole.log(tmp); // ReferenceErrorlet tmp; // TDZ结束console.log(tmp); // undefinedtmp = 123;console.log(tmp); // 123
}
不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。
// 报错
function func() {let a = 10;var a = 1;
}// 报错
function func() {let a = 10;let a = 1;
}
因此,不能在函数内部重新声明参数。
function func(arg) {let arg;
}
func() // 报错function func(arg) {{let arg;}
}
func() // 不报错
2.块级作用域
let实际上为 JavaScript 新增了块级作用域。
function f1() {let n = 5;if (true) {let n = 10;}console.log(n); // 5
}
上面的函数有两个代码块,都声明了变量n,运行后输出 5。这表示外层代码块不受内层代码块的影响。如果两次都使用var定义变量n,最后输出的值才是 10。
ES6 允许块级作用域的任意嵌套。
3.const 命令
基本用法
const声明一个只读的常量。一旦声明,常量的值就不能改变。
const PI = 3.1415;
PI // 3.1415PI = 3;
// TypeError: Assignment to constant variable.
上面代码表明改变常量的值会报错。
const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
const foo;
// SyntaxError: Missing initializer in const declaration
上面代码表示,对于const来说,只声明不赋值,就会报错。
const的作用域与let命令相同:只在声明所在的块级作用域内有效。
if (true) {const MAX = 5;
}MAX // Uncaught ReferenceError: MAX is not defined
const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
本质
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
《02》let 和 const 命令相关推荐
- ES6 let和const 命令
ES6 let 和 const 命令 1. 变量声明 2. 变量提升问题 3. 暂时性死区(TDZ) 4. 块级作用域 4.1 为什么需要块级作用域? 4.2 ES6的块级作用域 4.3 块级作用域和 ...
- let const 命令
一.let命令 用于声明变量. 1) 所声明的变量只在let命令所在代码块内有效.(块级作用域) {let a=10;var b=1; } a // ReferenceError: a is not ...
- ES6之let(理解闭包)和const命令
ES6之let(理解闭包)和const命令 最近做项目的过程中,使用到了ES6,因为之前很少接触,所以使用起来还不够熟悉.因此购买了阮一峰老师的ES6标准入门,在此感谢阮一峰老师的著作. 我们知道,E ...
- 2.let和const命令
1.let命令 let声明的变量,只在let命令所在的代码块内有效. {let a = 10;var b = 1; }a // ReferenceError: a is not defined. b ...
- ES6-let和const命令
let 1.ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. 2.不存在变量提升 var命令会发生"变量提升"现象 ...
- ES6新特性之let和const命令
let 和 const 命令 var 之前,我们写js定义变量的时候,只有一个关键字: var var 有一个问题,就是定义的变量有时会莫名奇妙的成为全局变量. 例如这样的一段代码: for(var ...
- es6 var、let、const命令
1.let和var <1>let声明的变量仅在块级作用域内有效: var声明的变量在全局有效: <2> var变量乐意在声明之前使用,输出undefined; let 不可以, ...
- “睡服”面试官系列第一篇之let和const命令(建议收藏学习)
目录 1let命令 1.1基本用法 1.2for循环小案例 1.3不存在变量提升 1.4暂时性死区 1.5不允许重复声明 2块级作用域 2.1为什么需要块级作用域? 2.2ES6 的块级作用域 2.3 ...
- 阮一峰 《ECMAScript 6 入门》:let 和 const 命令
以下内容全文出自 阮一峰的书: <ECMAScript 6 入门> 电子版地址:ES 6标准入门(第3版) let 命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于v ...
最新文章
- mysql 回滚 前滚_Oracle 实例恢复时 前滚 后滚说明
- Centos安装postgreSQL
- php 正规标题,一些PHP面试标题
- 笔记2014-08-26
- mac os 设置汇总
- C++关闭同步流 ios::sync_with_stdio(false);
- DBN深度置信网络的实现
- 嵩天老师python123测验_嵩天老师python123测验4: 程序的控制结构 (第4周)
- python tensorflow 智能家居_用 TensorFlow 让你的机器人唱首原创给你听
- 【第三方互联】10、注册成为支付宝(Alipay)开发者
- 带你学习Hive的多维立方体
- 基于python的学生成绩管理系统毕业设计源码071143
- python读文本并写入另一个文本文件中怎么做_使用文本Python将文件中的文本写入另一个文件...
- 极其简单的 使用IDEA 中 实现springboot 热部署 (spring boot devtools版)
- ENVI+IDL使用
- 纯前端实现模糊查询 或和且
- 计算机公共课5——演示文稿软件 PowerPoint 2010
- 专业的个人记帐软件 爱上记帐 1.0.1
- 金庸不朽,将在区块链世界中永生
- 创建网页的桌面快捷方式,快速打开网页
热门文章
- 【渝粤教育】电大中专电子商务网站建设与维护 (11)作业 题库
- 电源模块的6个优势及其作用
- 电源模块怎么选?以下6点你都知道吗?
- BLE蓝牙和传统蓝牙的区别
- java lambda 调用函数_Java lambda函数将如何编译?
- linux安装 icc编译器,安装 Intel Compiler (ifort icc icpc)
- android usb触摸屏驱动 win10,Win10手机居然这样兼容安卓:直接运行apk!
- php odbc驱动,用于Windows的PHP 7.0 ODBC驱动程序
- antd 3升级命令_是时候拥有一个你自己的命令行工具了
- java小程序 2048_微信小程序之游戏2048