也是用来声明变量,可是不一样于var,我的理解是它是用来修复var的一些神奇效果,似的变量更加规范,简单来讲let定义的变量就是私有变量,有如下几点做用安全
if (true) { let i; console.log(i); } //console.log(i); ReferenceError: i is not defined
let声明的i外部不能被访问闭包
for (let i = 0; i < 4; i ++) { console.log(i); } console.log(i); //i is not defined
之因此里面能访问i,由于for循环子做用域能访问外部做用code
for循环当在子做用域,声明let i时与循环体i是独立的对象
for (let i = 0; i < 4; i ++) { let i = 6; console.log(i); }
为何能,简单说就是i私有了内存
每次循环let都是从新申明的,正由于这样,就能解决for循环时闭包带来的问题作用域
for (let i = 0; i < 4; i ++) { setTimeout(function () {console.log(i)}, 100) } //0 1 2 3 for (var i = 0; i < 4; i ++) { setTimeout(function () {console.log(i)}, 100) } //4 4 4 4
不存在变量提高,io
//console.log(i); //console.log(typeof i); let i;
都是会报错的,i is not defined。
对于let声明的变量,typeof 再也不是安全形式了,而且该变量必须在声明后才能使用,在它以前使用那就是暂时的死区console
function f(x=y,y=2) {}; f(); //y is not defined let x = x; //x is not defined
同一做用域中也不能重复定义for循环
let i; let i; //报错
function f(n) { let n } f(); //报错
不一样做用域能够重复且各自独立function
function f(n) { {let n} }
let声明的变量不属于window
let i = 1; console.log(window.i); //undefined
做用和let同样,但多两点
一旦声明必须初始化,也就是必需赋值,不然报错;
const P = 1;
一旦赋值不能被改变,其本质是不能改变变量的内存地址
变量是原始类型的数据,其自己就是不可变的,再加上不能从新赋值,改变地址
const P = 1; P = 2; //报错
变量是对象类型的,其自己是可变的,因此也就能改变,要注意的是其地址并不改变
const P = {a : 1} ; P.a =2; console.log(P); //{a : 2}
想要其内容也不变,能够冻结它
const P = {a : 1} ; Object.freeze(P); P.a =2; console.log(P);