区别
- 使用
var声明变量,其作用域为该语句所在的函数内,且存在变量提升现象 - 使用
let声明变量,其作用域为该语句所在的代码块内,不存在变量提升,且let不允许在同一个作用域内,声明同一个变量
代码块指javascript中一个{}内的代码,包括:fn(){}、if(){}...
用法
function fun() {
let a = 1;
let a = b; // 报错
}
let 不允许在同一个作用域内,声明同一个变量。
if (true) {
let a = 1;
var b = 2;
}
console.log(a); // 报错
console.log(b); // 2
if 语句属于代码块,是 let 的作用域,所以在外部获取不到。
变量提升
浏览器在运行代码之前会预解析,首先解析函数声明,变量定义,解析完后再对函数变量进行运算、赋值等。
使用 var 声明变量,无论 var 变量处于当前作用域的第几行,都将 var 变量提升到作用域的头部并初始化为 undefined;使用 let 时,不会初始化。
{
console.log(a); // undefined
console.log(b); // Uncaught ReferenceError: Cannot access 'b' before initialization
var a = 'a';
let b = 'b';
}
重复声明问题
let 不允许重复声明,与全局变量同时声明时会暂时锁死。
{
// 重复声明
let a = 'a';
let a = 1; // Uncaught SyntaxError: Identifier 'a' has already been declared
}
// 暂时锁死的情况
let b = 'b';
if (true) {
console.log(b); // 此时报错:Uncaught ReferenceError: Cannot access 'b' before initialization
let b = 1;
console.log(b);
}
const
const 声明的变量不允许修改,且必须初始化。
const a; // Uncaught SyntaxError: Missing initializer in const declaration