这三个关键字的作用是什么?
用来声明在哪个作用域的变量。
所以,什么是作用域?
- 作用域就是一个独立的地盘,使变量不会暴露出去。
- JS 有三个作用域,分别是
全局作用域、函数作用域、块级作用域。 - ES6 前只有前面两个作用域,块级作用域是 ES6 出的。
- 它的出现是
解决在使用 if 或 for 循环里的花括号里声明的变量会污染变量或泄露成员变量这些问题。
var
- 它是 ES6 前声明变量的关键字,具有全局作用域和函数作用域,意味着能跨块访问,不能跨函数访问
- 可以不用初始化值
var a;
console.log(a); //undefined
- 存在变量提升
console.log(a); //undefined
var a = 10;
- 同一作用域中允许重复声明
var a = 10;
var a = 20;
//或者
var a = 10; var a = 20;
- 没有暂时性死区(可以在没有先声明的情况下,提前使用该变量)
a = 10;
var a = 20;
- 全局作用域用 var 声明的变量会挂载到全局对象下
//全局对象(浏览器打开就是window,node打开就是global)
var a = 10;
console.log(a); //10
console.log(window.a); //10
let
- 有块级作用域,意味着不能跨块访问
- 可以不用初始化值
let a;
console.log(a); //undefined
- 不存在变量提升
console.log(a); //ReferenceError: Cannot access 'a' before initialization
let a = 10;
- 同一作用域中不允许重复声明,但可以重新赋值
var a = 10;
let a = 20; //SyntaxError: Identifier 'a' has already been declared
//或者
let a = 10; let a = 20; //SyntaxError: Identifier 'a' has already been declared
- 有暂时性死区(必须要先声明前,才可以使用该变量)
{
console.log(a); //ReferenceError: Cannot access 'a' before initialization
let a = 20;
}
- let 声明的变量不会挂载到全局对象下,会挂载到 Script
var 和 let 的共同点
就一个,可以不用初始化值,其它的就是相反的,毕竟是后来才出的,是为了解决一些以前所解决不了的问题。
const
与 let 几乎一样,就两个不同点
- 必须初始化值
const a; // SyntaxError: Missing initializer in const declaration
//下面是正确的
const a = 10;
- 赋值后对于普通类型不能更改变量,但是对于引用类型可以为其添加属性
{
// 普通类型
const a = 10;
a = 20; // TypeError: Assignment to constant variable
// 引用类型
const b = {}
b.a = 10;
}