首先总结下let/var/const三者的区别与联系
总结
1.let和var和const的区别
- let没有变量提升(Hoisting),var有,所谓的变量提升即能否在声名变量前访问变量
- let 有块级作用域,var没有,所以if for等块对var来说没有限制作用,对let有
- 在全局作用域中let声明不会像var一样会在全局window对象中创建一个属性
- let会有暂时性死区,只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
- const的作用很多时候和let是一样的,但通过const声明的变量为基础数据类型时,它是不可变的(改变会报错),当它声明的变量为引用类型时,可以修改它的属性,如果要确保引用类型值的属性值不可变,请使用Object.freeze()冻结,但如果需要彻底冻结,还需要循环使用Object.freeze()
彻底冻结对象
<script>
function myFreeze(obj) {
Object.freeze(obj)
Object.values(obj).forEach(item => {
if(typeof item === 'object') {
myFreeze(item)
}
})
}
const obj = {
name: 'lf',
ver: [1, 2, 3]
}
myFreeze(obj)
obj.ver[0] = 0
</script>
关于let暂时性死区
var tmp = 123;
if (true) {
console.log(tmp) // ReferenceError: Cannot access 'tmp' before initialization
let tmp = 456;
}
关于var变量提升/无视块级作用域
var name = 'lf';
(function() {
if(typeof name === 'undefined') {
var name = 'stu'
console.log(name)
}else{
console.log(name)
}
})()