JS 中作用域有:全局作用域、函数作用域。没有块作用域的概念。 ES6 中新增了块级作用域。块作用域由 { } 包裹,if 语句和 for 语句里面的 { } 也属于块作用域。
1. var 声明的变量有变量提升的特性,而 let、const 没有
console.log(a) // undefiend
var a = 10;
// 相当于
var a;
console.log(a); // undefiend
a = 10;
console.log(b) // 报错 未定义
let b = 10;
console.log(c) // 报错 未定义
const c = 10;
2. var 声明的变量会挂载到 windows 对象上,所以使用 var 声明的是全局变量,而 let 和 const 声明的变量是局部变量, 块级作用域外不能访问
if(true) {
var a = 10;
let b = 10;
const c = 10;
}
console.log(a); // 10
console.log(b); // b is not defined
console.log(c); // c is not defined
3. 同一作用域下 let 和 const 不能重复声明同名变量,而var可以
var a = 10;
let b = 10;
const c = 10;
var a = 20;
console.log(a); // 20
let b = 20; // 报错 b 已声明不能重复声明
const c = 20; // 报错 c 已声明不能重复声明
4. const 的特点
- 声明后不能再修改
- 一旦声明必须赋值
- 如果声明的是复合类型数据,可以修改其属性
// const a; 报错 必须赋值
let aa = 10;
aa = 20;
console.log(aa); // 20
const a = 10;
// a = 20; 报错 不能修改
const arr = ['杨和苏'];
arr[0] = 'GAI'
console.log(arr); // ["GAI"]
const obj = {name: '大傻'};
obj.name = '刘聪';
obj.age = 38;
console.log(obj); // {name: "刘聪", age: 38}