var和let、const的区别,let、const真的不存在变量提升吗?
- 东瓜粥
- 2024-07-23
- 52
1.var
1.1.全局作用域,函数作用域
var a = 1
console.log(a, window.a); // 1 1
function fn() {
var a = 1
console.log(a); // 1
}
fn()
console.log(window.a); // undefined
1.2.允许重复声明
var a = 1
var a = 2
console.log(a); // 2
1.3.可以再次赋值
var a = 1
a = 2
console.log(a); // 2
1.4.存在变量提升
console.log(a); // undefined
console.log(b); // b is not defined
var a = 1
2.let、const
2.1.块级作用域
if (true) {
let a = 1
console.log(a); // 1
}
console.log(a); // a is not defined
if (true) {
const b = 1
console.log(b); // 1
}
console.log(b); // b is not defined
2.2.相同作用域下只能声明一次
let a = 1
let a = 2 // Cannot redeclare block-scoped variable 'a'.(不能重新声明块作用域变量'a'。)
const b = 1
const b = 2 // Cannot redeclare block-scoped variable ‘b’.(不能重新声明块作用域变量’b’。)
let a = 1
if (true) {
let a = 2
console.log(a); // 2
}
const b = 1
if (true) {
const b = 2
console.log(b); // 2
}
2.3.let、const只是开始声明,而非一个完整的表达式。这意味着你不能将单独的 let 或 const 声明作为一个代码块的主体
if (true) let a = 1;
// 'let' declarations can only be declared inside a block.
// 'let'声明只能在块中声明。
if (true) const a = 1;
// ‘const’ declarations can only be declared inside a block.
// 'const’声明只能在块中声明。
2.4.let声明的变量可以再次赋值
let a = 1
a = 2
console.log(a); // 2
2.5.const声明的是一个常量,一旦声明,常量的值(内存地址不能改变)不能改变,但如果声明的是一个对象,就可以修改对象中的属性
const a = 1
a = 2 // Assignment to constant variable.(对常量变量赋值。)
const b = { name: ‘b’ }
b.name = ‘B’
console.log(b); // { name: ‘B’ }
2.6.存在暂时性死区,let和const所声明的变量必须要在声明后使用,否则便会报错
console.log(a); // Cannot access 'a' before initialization(在初始化之前无法访问'a')
let a = 1
console.log(b); // Cannot access ‘b’ before initialization(在初始化之前无法访问’b’)
const b = 1
3.let、const真的不存在变量提升吗?
每个变量都存在创建、初始化、赋值是三个阶段, var
声明变量时会同时提升自己的创建和初始化阶段,let
、const
声明变量时只提升自己的创建阶段,ES6 中规定 let
、const
声明的变量在其所在上下文的执行阶段初始化,意思就是变量的定义被执行时才会进行初始化
标签:js