let const 都属于 es6 的内容
let(变量)
声明的变量可以改变,值和类型都可以改变
-
let声明 的变量 没有变量提升; 而且他也不是 window 上的一个属性
-
不能重复声明 ; 重复声明会报错; 可以重新赋值
-
let命令用来声明变量,他的作用类似于var,但是所声明的变量只在let命令所在的代码块内部有效
// var a =12;
// b = 13
// let a = 12;
// a = 13;
for()循环的计数器,适合使用let命令;
for(let i =0;i<5;i++){
}
console.log(i);//ReferenceError :i is not defined
const(常量)
声明一个只读的常量,一旦声明,常量的值不能修改;
所谓常量就是物理指针不可以更改的变量。
-
const声明 的常量 没有变量提升; 而且他也不是 window 上的一个属性
-
不能重复声明 ; 重复声明会报错; 可以重新赋值
-
const命令用来声明常量,所声明的常量只在const命令所在的代码块内部有效;
const 除了不能改变物理指针的特性,其他特性和 let 一样。
当声明普通数据类型的时候,那么一但声明了,就不可以再改变。
const a = 1;
a = 2; //Uncaught TypeError: Assignment to constant variable.改变之后报错
块级作用域
es6 块级作用域 {} for if while
块级作用域 :只跟 let 或者 const 声明的变量起作用;对于 var 没有块级作用域的限制
为什么需要块级作用域
ES5中只有全局作用域和函数作用域,会带来很多问题
1、变量提升导致函数作用域里面变量影响调用外部变量(内层变量覆盖外层变量)
var i = 5;
function sum() {
console.log(i);
if (true) {
var i = 6;
}
}
sum(); // undefined
2、 for循环中用来计数的 变量泄露为全局变量,影响全局变量
for (var i = 0; i < 10; i++) {
console.log(i);
}
console.log(i);//10
所以为了解决以上问题ES6推出了块级作用域,使用let或const命令进行变量声明,只在let声明的代码块内有效,影响不了调用外部变量
var i = 5;
function sum() {
console.log(i);
if (true) {
let i = 6;
}
}
sum(); // 5
var i = 5;
function sum() {
console.log(i);
if (true) {
const i = 6;
}
}
sum(); //5
也解决了for循环中变量泄露为全局变量的问题
for (let i = 0; i < 10; i++) {
console.log(i);
}
console.log(i);//undefined
在这里插入代码片
暂时性死区
用var 声明过的变量 ,会有变量提升,给一个默认值是undefined
用let 和 const 声明的变量, 不会进行变量提升,但是他也会对里边的带let 和 const 的变量进行预览,这时 ,浏览器不会再往上级作用域查找相应变量
var a =13;
function f1() {
console.log(b);
console.log(a);
let a = 15;
var b = 10;
console.log(b,a);
}
f1();//报错函数无法执行
因为暂时性死区的影响,使console.log(a)无法调用上级作用域,对let和const进行预览,但是let和const没有变量提升,而且按代码执行顺序,也调用不到下面let a的变量,所以a没有定义过,报错,暂时性死区会造成函数无法执行