变量提升
1.var 声明
var 声明变量的时候会有生命提升,但仅是声明会提升,赋值不会提升例如:
console.log(num); // undefined var num 会被提升
var num = 10;
会被解析为
var num // 声明被提升了
console.log(num); //此时变量的状态是声明未赋值,所以变量值为undefined
num = 10; // 赋值未被提升
2.let 声明
let声明的变量不提升
// let声明的变量不提升
console.log(num); // Cannot access 'num' before initialization
// 在初始化之前无法访问“num”
let num = 10;
3.const声明
let声明的变量不提升
// 没有变量提升
console.log(a); // Cannot access 'a' before initialization
// 在初始化之前无法访问“a”
const a = 10;
作用域
var
var在函数内部声明的变量只在该函数内部有效,而在函数外部声明的var变量为全局变量,全局有效
function example() {
var x = 1;
console.log(x); // 输出 1
}
console.log(x); // 报错,x未定义
var y = 2;
console.log(y); // 输出 2
let 和 const
let和const的作用域是块级作用域。块级作用域是指在{}中的任何地方声明的变量只在该块内部有效。例如:
function example() {
if (true) {
let x = 1;
var y = 2;
const z = 3;
console.log(x); // 输出 1
console.log(y); // 输出 2
console.log(z); // 输出3
}
console.log(x); // 报错,x未定义
console.log(y); // 输出 2
console.log(z); // 报错,z未定义
}
example()
console.log(x); // 报错,x未定义
console.log(y); // 输出 2
console.log(z); // 报错,z未定义
重复声明
var
var x = 1;
console.log(x); // 输出 1
var x = 2;
console.log(x); // 输出 2
let
let y = 1;
console.log(y); // 输出 1
let y = 2; // 报错,重复声明变量y
const
const z = 1;
console.log(z); // 输出 1
const z = 2; // 报错,重复声明常量z
暂时性死区
let、const和var都存在"暂时性死区"的概念。在一个作用域中,当使用let或const声明一个变量或常量时,该变量或常量会在声明之前被绑定到该作用域。
var name = 'window';
if(1) {
// 无法访问外部变量
console.log(name); // Cannot access 'name' before initialization
const name = 'const'
}
值能否修改
除了const声明的不能修改,let 和 var 声明的变量都能够修改
const a = 10;
a = 20
console.log(a); // 报错const声明的变量不能被修改
var | let | const | |
---|---|---|---|
变量提升 | ✅ | ❎ | ❎ |
能否被修改 | ✅ | ✅ | ❎ |
必须赋初值 | ❎ | ❎ | ✅ |
能否重复声明 | ✅ | ❎ | ❎ |
作用域 | 全局 | 块 | 块 |