变量声明
let:let声明的变量只有所处于的块级有效
当业务逻辑比较复杂的时候,可以防止内层变量覆盖外层变量
在一个大括号中使用let关键字声明的变量才具有块级作用域,var不具备
防止循环变量变成全局变量
使用let关键字声明的变量,不存在变量提升
if(true){ let a=10; console.log(a);//a可以被访问,输出为10 if(true){ let c=20; var b=30; } console.log(c);//c不能被访问 console.log(b);//b可以被访问,理论上输出为30,但是由于c报错,所有后面代码并未执行 } console.log(a);//a不能被访问
for(var i=0;i<2;i++){ } console.log(i);//i可以被访问,打出的i=2. for(let j=0;j<2;j++){ } console.log(j);//j不能被访问,j未被定义 </script> <script> console.log(a);//可以输出a为undefind var a=10; console.log(b);//报错,b未被定义 let b=20;
//暂时性的死区 var temp=123; if(true){ console.log(temp);//这个temp不会是var 的temp,而是if大括号里面的temp. let temp=20;
var arr=[]; for(var i=0;i<2;i++){ arr[i]=function(){ console.log(i); } } arr[0]();//输出结果为2 arr[1]();//输出结果为2 let brr=[]; for(let j=0;j<2;j++){ brr[j]=function(){ console.log(j); } } brr[0]();//输出为0 brr[1]();//输出为1
// const: 用来声明常量的,常量就是值(内存地址)
//具有块级作用域
//声明常量时必须赋初值
//值不可改变(地址不可更改,即栈数据不可改)原始值存入栈,引用值存入堆
if(true){ const a=10; } console.log(a); const b=10; b=20; console.log(b);//Assignment to constant variable 不能分配一个值给常量 const arr=[100,200]; arr[0]=300; console.log(arr);//输出arr[300,200] arr=[5,3]; console.log(arr);//Assignment to constant variable 不能分配一个值给常量