let
存在块级作用域:
(1)外层作用域取不到内层作用域的变量
(2)内层作用域可以定义外层作用域的同名变量。
所声明的变量,只在let命令所在的代码块内有效
if(true){
let a = "123";
console.log(a); //123
}
console.log(a); //ReferenceError a is not undefined
for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域
for(let i=0;i<3;i++){
let i='abc';
console.log(i);
}
// abc// abc// abc
上面代码正确运行,输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。
不存在变量提升:在变量声明之前使用,都是会报错的。以前的var声明的变量可以变量提升,在变量声明之前使用,值为 undefined。但是使用let声明的变量,一定要在let声明之后
暂时性死区:在代码块(块级作用域)内存在let命令,它所声明的变量,就“绑定”这个区域,不再受外界影响。
例子:
var temp = 123;
if(true){
temp = 'aaa'; //Reference Error
let temp;
}
因为在块级作用let 声明了一个局部变量,导致这个变量绑定了这个块级做哟用于,所以在let声明变量之前,对temp 赋值会报错。 (代码块内,使用let命令声明变量之前,该变量都不可用)
~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~
在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)
if(true){
// TDZ开始
tmp='abc'; // ReferenceErrorconsole.log(tmp); // ReferenceError
let tmp; // TDZ结束console.log(tmp); // undefinedtmp=123;console.log(tmp); // 123}
不允许重复声明
let不允许在相同的作用域内,重复声明同一个变量。
// 报错
functionfunc(){
let a=10;
var a=1;
}
// 报错
function func(){
let a=10;
let a=1;
}
function func(arg) {
let arg; // 报错
}
function func(arg) {
{
let arg; // 不报错
}
}
const
声明一个只读的常量。一旦声明,常量的值就不能改变。
const一旦声明就必须立即初始化,不能留到以后赋值
与let相同的是:
只在声明所在的块级作用域内有效
有暂时性死区(必须在声明之后才能使用)。
const命令声明的常量也不能提升。
const声明的常量,不可重复声明。