let 、const 与var的区别?

121 阅读2分钟

ECMAScript (1).png

// 常量const
// const是为了那些一但初始化就不希望重新赋值的情况设计的

// const注意事项
// 1、使用const声明常量,一旦声明,就必须立即初始化,不能留到以后赋值
// 错误案例:
// const sex;
// sex = 'male';
// 正确案例:
const sex = 'male';

// 2、const声明的常量允许在不重新赋值的情况下修改它的值(只针对引用数据类型)
const person = {username:'wali'};
// person = {}; 错误用法
person.username = 'ZhangSan';
console.log(person);

// 到底是用const声明变量还是let、
// 在实践开发中,当不确实使用const还是let时,推荐直接使用const、如果后续发生了修改,程序会报错,看到错误在改为let也来的及,
// 如果一开始就使用let可能不小心,将变量的值改变了,是不希望发生的


// let 、 const 与var的区别?
// 1、重复声明
// var  允许重复声明,let、const不允许
var a = 1;
var a = 2;
// let b重复声明会报错
// let b = 1;
// let b= 2;

// 2、变量提升
// var 会提升变量的声明到当前作用域的顶部
// console.log(b); 不会报错且会打印出underfind,因为变量b的声明被提升了
console.log(b);
var b = 1;
// let const不存在变量提升
console.log(c); // 这里会报错
let c = 1;

// 建议所有变量或者常量,做到先声明,后使用

//3、暂时性死区域问题
// 只要作用域内存在let、const、她们所声明的变量或者常量就自动“绑定”
// 这个区域,不在受外部作用域的影响
// 作用域链:函数作用域找不到就会去外面全局作用域查找(函数作用域只有在函数被调用时才存在)
// 当在函数中如果使用了let或者const声明了变量,那么这个变量会与函数绑定,只在函数中查找,找不到就会报错

let wali ='wali';
function a(){
 console.log(wali); // 会打印出全局作用域中的瓦力


}
function b(){
console.log(wali); // 发生了暂时性死区,函数b中找不到wali变量的声明,会报错
   let wali = 'wali';
}

// 4、windows 对象的属性和方法
// 全局作用域中,var声明的变量,通过function声明的函数,会自动变成window对象的属性或方法
// let 、const 不会

 // 5、块级作用域
 // 有函数作用域、全局作用域,块级作用域
 // var 没有块级作用域的
for(var i=0;i<3;i++){
    
}
console.log(i);// i是全局作用域中的一个变量。
// let、const是有块级作用域的
for(let i=0;i<3;i++){
    
}
console.log(i);// 这里会报错,因为let是有块级作用域的,与for循环共同构成了一个块级作用域,循环执行结束就销毁了所有会找不到i


 // 作用域链:内层作用域>外层作用域>全局作用域
 //  函数调用时会形成函数作用域,函数外面是全局作用域,函数中的for循环是块级作用域
// 有哪些块级作用域
// {} 就可以构成块级作用域
// for循环
// while循环
// do{}while()
// if
// switch()
// 块级作用域只有与let、const配合使用才会有