0
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 声明变量时会同时提升自己的创建和初始化阶段,letconst 声明变量时只提升自己的创建阶段,ES6 中规定 letconst 声明的变量在其所在上下文的执行阶段初始化,意思就是变量的定义被执行时才会进行初始化

标签:js
评论
一些工具
全部评论0
热度 / 时间
暂无评论