let与const:
let
- 暂存死区(相当于预加载机制无法加载到的,即为暂存死区)
let monkey = '我是美猴王';
{
console.log(monkey); // 报错
let monkey = '我觉得我还能再抢救一下!';
}
console.log(monkey); // 执行不到这里
由于let是块级作用域,第一次打印,对内申明前访问,自然访问不到,对外变量名冲突,也访问不到。
- 生成十个按钮 每个按钮点击的时候弹出1 - 10
// var 声明
var i = 0;
for (i = 1; i <= 10; i ++) {
(function(i) { // 子执行匿名函数
var btn = document.createElement('button');
btn.innerText = i;
btn.onclick = function() {
alert(i)
};
document.body.appendChild(btn);
})(i);
}
// let 声明
for (let i = 1; i <= 10; i ++) {
var btn = document.createElement('button');
btn.innerText = i;
btn.onclick = function() {
alert(i);
};
document.body.appendChild(btn);
}
let与var的区别:
- let声明的变量只在当前(块级)作用域内有效
- var声明的变量只在当前作用域内有效
- let声明的变量不能被重复声明
- let不存在变量提升(JavaScript中,函数及变量的声明都将被提升到函数的最顶部。 JavaScript中,变量可以在使用后声明,也就是变量可以先使用再声明)
- ES6之前的作用域:全局作用域、函数作用域、eval作用域
常量 const
- 常量声明:声明的时候必须要初始化(即赋值),否则会报错。
const a; // 报错
const aa = 1;
var b = 2;
let c; // undefinded
- 常量声明后不能被修改。
const NAME = '小明';
NAME = '小红'; // NAME is not defined
- 常量为引用类型的时候 可以修改该引用类型
const xiaoming = {
age: 14,
name: '小明'
};
console.log(xiaoming);
xiaoming.age = 22;
console.log(xiaoming);
xiaoming = {};

- 怎么防止常量为引用类型的时候能被修改的情况 Object.freeze(对象名)
Object.freeze()
const xiaoming = {
age: 14,
name: '小明'
};
Object.freeze(xiaoming);
console.log(xiaoming);
xiaoming.age = 22;
xiaoming.dd = 11;
console.log(xiaoming);
修改前后值任然一样,说明未能被修改。

常量与变量
- 变量是可以改变的,常量声明必须赋值,但是不能重复声明。
- const 与 let:不能重复声明,不存在变量提升,只在当前(块级)作用域内有效
块级作用域
相当于就是一堆{...}中间区域,块级作用域可以嵌套
{
// 我是块级作用域1
{
// 我是块级作用域2
}
}