概述
- 在ES6之前,我们定义变量都是使用var,使用var会存在变量提升的现象。
- ES6中提出了新的声明变量的方式,let和const,这两个不会存在变量提升的现象。
let和const共同特性
let和const都一样的就有一个却别,共同特性使用const演示
- 块级作用:在代码块之外不可使用
if(true) {
const a = 1;
}
console.log(a) // 报错
- 暂时性死区:不允许在声明之前使用
console.log(a); // 报错
const a = 1;
- 不允许重复声明:声明同名的变量会报错
const a = 1;
const a = 2; // 报错
- 不进行全局挂载:全局定义的变量不再作为属性添加到全局对象中
const a = 1;
window.a; // undefined
let用法
概述: var怎么使用let就怎么使用,只不过是拥有上面说的特性
拥有块级作用,有了这个可以解决我们的一个经典问题。问题是:如何在一秒钟以后输出0 ~ 9?
以前的解法:需要使用一个立即执行函数来存储一下当前的变量i
for(var i = 0; i < 10; i ++) {
(function (i) {
setTimeout(function () {
console.log(i)
}, 1000)
}(i))
}
现在的做法:就是用let就完事了,比上面的要简洁的多
for(let i = 0; i < 10; i ++) {
setTimeout(function () {
console.log(i);
}, 1000)
}
const(常量)用法
const跟let基本一摸一样,只有两个个区别
- const在定义变量的时候必须初始化(赋值)
const a; // 报错
const a = 1; // 必须在定义变量的时候赋值
- const定义了以后就不能更改(不能重新赋值)
const a = 1;
a = 2; // 报错
我们定义的这个变量是一个对象时 你就会发现还是能改变里面的值的,如下
// 以下代码时不会报错的
var obj = {
age = 17;
}
obj.age = 18;
那么为什么会这样子呢,不能改变指的是不能改变这个常量obj的值,上面obj的值是这个对象的一个地址,我通过这个地址改了obj对象里面的东西,跟这个常量obj没有半毛钱关系。
如果是下面这种方式就不行,因为是给它重新赋值了
obj = { name = 18; } // 报错