1:用let声明变量具有块级作用域,先声明再使用
let num = 10;
if(1==1){
let num=5;
console.log("块级作用域的num:"+num);//5
}
console.log("全局作用域的num:"+num);//10
2:不存在变量提升
console.log(num);//error
let num=10;
3:暂时性死区,未声明就使用
let num = 10;
if(1==1){
console.log(num);//error
let num=20;
}
4:let声明的变量 不能重复
let num=10;
let num=100;
console.log(num);//error
5:const let 变量 const常量
const PI = 3.14;
PI = 123;//重新赋值就会出错
console.log(PI);
案例 块级作用域,作用域链(没有声明往上找)
let arr = [];
for(let i=0;i<3;i++){
arr[i] = function(){
console.log(i);
}
}
arr[0]();//0
arr[1]();//1
arr[2]();//2
let num = 10;//顶级属性
console.log(window.num);
var let const 三者区别:
- var:
- 定义变量会有变量提升
- 定义变量可以反复定义,后面定义的会覆盖前面的
- 在循环中使用的时候,循环体外依然可以使用
- 在循环绑定事件过程中,var定义的变量无法保存,循环会在瞬间执行完
- let:
- let定义的变量不会预解析,必须先声明再使用,否则会报错
- let不能定义已经定义过的变量
- let是块级作用域,函数内部使用let定义后,对函数外部无影响,简单说就是在一个{}里面生效
- 由于let是块级作用域,在循环绑定事件过程中let会在这个循环中生效,再次循环时let会重新定义生效
- const:
- const定义的变量不会预解析,必须先声明再使用,否则会报错
- const定义的变量不允许修改
- 但是,在数组里面,const的值是允许被修改的,这是因为const存储的是地址,值的内容可以变化
使用 let,const 的声明的变量不属性顶层对象,返回 undefined
let一般应用于基本数据类型;const 一般应用于引用数据类型,也就是函数对象等。
首先const声明常量的好处,一是阅读代码的人立刻会意识到不应该修改这个值,二是防止了无意间修改变量值所导致的错误,另外其实js编译器也对const进行了优化,可以提高代码的执行效率