共计 1496 个字符,预计需要花费 4 分钟才能阅读完成。
ES6 中的 let 与 const 关键字
博客阐明
文章所波及的材料来自互联网整顿和集体总结,意在于集体学习和教训汇总,如有什么中央侵权,请分割自己删除,谢谢!
简介
let 和 const 是 es6 新减少的两个关键字,次要作用是用来申明变量
let 关键字
用法
let
申明的变量只在 let
命令所在的代码块内无效,不能反复申明
{ | |
let a = 0; | |
var b = 1; | |
a // 此时输入 0 | |
b // 此时输入 1 | |
} | |
a // 此时报错 ReferenceError: a is not defined | |
b // 此时输入 1 |
罕用环境
在应用 for
循环时,适宜应用 let
命令
for (let i = 0; i < 10; i++){...} | |
i // 此时报错 ReferenceError: i is not defined |
在上述代码中,i
只在 for
循环体之中无效,在循环体之外调用就会报错
var a = []; | |
for (var i = 0; i < 10; i++){a[i] = function(){console.log(i); | |
} | |
} | |
a[8](); // 10 |
在上述代码中,变量 i
是var
命令申明的,在全局范畴内都无效,所以全局只有一个变量i
。
每一次循环,变量 i
的值都会产生扭转,而循环内被赋给数组 a
的函数外部的 console.log(i)
,外面的i
指向的就是全局的 i
。也就是说,所有数组a
的成员外面的 i
,指向的都是同一个i
,导致运行时输入的是最初一轮的i
的值,也就是 10。
var a = []; | |
for (let i = 0; i < 10; i++){a[i] = function(){console.log(i); | |
} | |
} | |
a[8](); // 8 |
如果应用 let,申明的变量仅在块级作用域内无效,最初输入的是 8。
不存在变量晋升
let 不存在变量晋升,var 存在变量晋升
var
命令会产生“变量晋升”景象,即变量能够在申明之前应用,值为 undefined
,let
命令扭转了语法行为,它所申明的变量肯定要在申明后应用,否则报错。
console.log(a); //ReferenceError: a is not defined | |
let a = "apple"; | |
console.log(b); //undefined | |
var b = "banana"; |
上述代码中,b
在脚本开始运行时就存在了,然而还没有进行赋值,所以返回 undefined
。a
在变量申明之前不存在,所以会报错。
const 关键字
用法
const
申明一个只读变量,申明之后不容许扭转
const PI = "3.1415926"; | |
PI // 此时输入 3.1415926 | |
PI = 3; | |
// TypeError: Assignment to constant variable. | |
const MY_AGE; // 此时报错 SyntaxError: Missing initializer in const declaration |
const
一旦申明必须初始化,否则会报错,只申明不赋值也会报错
暂时性死区(TDZ)
只有代码块中蕴含 let 或者 const,它所申明的变量就会绑定这个区域,不会再受内部的影响
var tmp = 123; | |
if (true) { | |
tmp = 'abc'; // ReferenceError | |
const tmp; | |
} |
暂时性死区的范畴
在代码块内,应用 let
或者 const
命令申明变量之前,该变量都是不可用的。
if (true) { | |
// TDZ 开始 | |
tmp = 'abc'; // ReferenceError | |
console.log(tmp); // ReferenceError | |
let tmp; // TDZ 完结 | |
console.log(tmp); // undefined | |
tmp = 123; | |
console.log(tmp); // 123 | |
} |
感激
万能的网络
菜鸟教程
阮一峰的 es6 语法教程
以及勤奋的本人,集体博客,GitHub