var 关键字
1.没有块级作用域
{
var a = 10;
}
console.log(a); //10
2.有全局作用域、函数作用域
var a = 10;
function printf(){
var b = 20;
console.log(a); //10
console.log(b); //20
}
printf();
console.log(b); //ReferenceError: b is not defined
3.存在变量提升
printf();
function printf(){
console.log(a); //undefined
var a;
}
4.同一作用域中允许重复声明
var a = 10;
var a = 20;
console.log(a); //20
let 关键字
1.有块级作用域
{
let a = 10;
}
console.log(a); //ReferenceError: a is not defined
2.不存在变量提升
{
console.log(a); //ReferenceError: Cannot access 'a' before initialization
let a = 10;
}
3.暂时性死区
if (true) {
console.log(a); //ReferenceError: Cannot access 'a' before initialization
let a;
// 暂时性死区
console.log(a); //undefined
}
4.同一块作用域中不允许重复声明
{
let A;
let A; //SyntaxError: Identifier 'A' has already been declared
}
const 关键字
1.有块级作用域
{
const a = 10;
}
console.log(a); //ReferenceError: a is not defined
2.不存在变量提升
{
console.log(a); //ReferenceError: Cannot access 'a' before initialization
const a = 10;
}
3.暂时性死区
if (true) {
console.log(a); //ReferenceError: Cannot access 'a' before initialization
const a;
// 暂时性死区
console.log(a); //undefined
}
4.同一块作用域中不允许重复声明
{
const A;
const A; //SyntaxError: Identifier 'A' has already been declared
}
5.初始化必须赋值
const a; // SyntaxError: Missing initializer in const declaration
6.常量值不能改变
{
const a = 10;
a = 20; // TypeError: Assignment to constant variable
}
相关面试题
var、let和const的区别?
-
var 没有块的概念,可以跨块访问, 不能跨函数访问,有变量提升。
-
let 只能在块作用域里访问,不能跨块访问,也不能跨函数访问,无变量提升,不可以重复声明。
-
const 用来定义常量,使用时必须初始化(即赋值),只能在块作用域里访问,而且不能修改,无变量提升,不可以重复声明。