目录

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 命令相关推荐

  1. ES6 let和const 命令

    ES6 let 和 const 命令 1. 变量声明 2. 变量提升问题 3. 暂时性死区(TDZ) 4. 块级作用域 4.1 为什么需要块级作用域? 4.2 ES6的块级作用域 4.3 块级作用域和 ...

  2. let const 命令

    一.let命令 用于声明变量. 1) 所声明的变量只在let命令所在代码块内有效.(块级作用域) {let a=10;var b=1; } a // ReferenceError: a is not ...

  3. ES6之let(理解闭包)和const命令

    ES6之let(理解闭包)和const命令 最近做项目的过程中,使用到了ES6,因为之前很少接触,所以使用起来还不够熟悉.因此购买了阮一峰老师的ES6标准入门,在此感谢阮一峰老师的著作. 我们知道,E ...

  4. 2.let和const命令

    1.let命令 let声明的变量,只在let命令所在的代码块内有效. {let a = 10;var b = 1; }a // ReferenceError: a is not defined. b ...

  5. ES6-let和const命令

    let 1.ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. 2.不存在变量提升 var命令会发生"变量提升"现象 ...

  6. ES6新特性之let和const命令

    let 和 const 命令 var 之前,我们写js定义变量的时候,只有一个关键字: var var 有一个问题,就是定义的变量有时会莫名奇妙的成为全局变量. 例如这样的一段代码: for(var ...

  7. es6 var、let、const命令

    1.let和var <1>let声明的变量仅在块级作用域内有效: var声明的变量在全局有效: <2> var变量乐意在声明之前使用,输出undefined; let 不可以, ...

  8. “睡服”面试官系列第一篇之let和const命令(建议收藏学习)

    目录 1let命令 1.1基本用法 1.2for循环小案例 1.3不存在变量提升 1.4暂时性死区 1.5不允许重复声明 2块级作用域 2.1为什么需要块级作用域? 2.2ES6 的块级作用域 2.3 ...

  9. 阮一峰 《ECMAScript 6 入门》:let 和 const 命令

    以下内容全文出自 阮一峰的书: <ECMAScript 6 入门> 电子版地址:ES 6标准入门(第3版) let 命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于v ...

最新文章

  1. mysql 回滚 前滚_Oracle 实例恢复时 前滚 后滚说明
  2. Centos安装postgreSQL
  3. php 正规标题,一些PHP面试标题
  4. 笔记2014-08-26
  5. mac os 设置汇总
  6. C++关闭同步流 ios::sync_with_stdio(false);
  7. DBN深度置信网络的实现
  8. 嵩天老师python123测验_嵩天老师python123测验4: 程序的控制结构 (第4周)
  9. python tensorflow 智能家居_用 TensorFlow 让你的机器人唱首原创给你听
  10. 【第三方互联】10、注册成为支付宝(Alipay)开发者
  11. 带你学习Hive的多维立方体
  12. 基于python的学生成绩管理系统毕业设计源码071143
  13. python读文本并写入另一个文本文件中怎么做_使用文本Python将文件中的文本写入另一个文件...
  14. 极其简单的 使用IDEA 中 实现springboot 热部署 (spring boot devtools版)
  15. ENVI+IDL使用
  16. 纯前端实现模糊查询 或和且
  17. 计算机公共课5——演示文稿软件 PowerPoint 2010
  18. 专业的个人记帐软件 爱上记帐 1.0.1
  19. 金庸不朽,将在区块链世界中永生
  20. 创建网页的桌面快捷方式,快速打开网页

热门文章

  1. 【渝粤教育】电大中专电子商务网站建设与维护 (11)作业 题库
  2. 电源模块的6个优势及其作用
  3. 电源模块怎么选?以下6点你都知道吗?
  4. BLE蓝牙和传统蓝牙的区别
  5. java lambda 调用函数_Java lambda函数将如何编译?
  6. linux安装 icc编译器,安装 Intel Compiler (ifort icc icpc)
  7. android usb触摸屏驱动 win10,Win10手机居然这样兼容安卓:直接运行apk!
  8. php odbc驱动,用于Windows的PHP 7.0 ODBC驱动程序
  9. antd 3升级命令_是时候拥有一个你自己的命令行工具了
  10. java小程序 2048_微信小程序之游戏2048