var、let、const 的本质区别

声明方式作用域变量提升初始赋值重复声明改变值
var函数作用域不需要允许可以
let块作用域不需要不允许可以
const块作用域需要不允许不可以
改变值

var/let 声明的是变量,可改变值

const 声明的是常量,不可改变值

作用域

var 声明的变量不允许在其所在函数作用域之外使用

let/const 声明的变量/常量不允许在其所在块级作用域之外使用

变量提升

用 var 声明的变量有变量提升,并且默认赋值为 undefined,所以在变量声明之前获取变量的值为 undefined

let/const 声明的变量/常量也有变量提升,但是不会被初始化赋值,不能被引用。因为 ES6 规定,如果区块中存在 letconst 命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域(暂时性死区)。凡是在声明之前就使用这些变量,就会报错

下面用一个例子来证明:

let a = 1;
(function () {
    console.log(a);	// 1
    // let a = 3;
})()

可以看到,注释之后,由于函数的作用域链,在闭包内没有找到 a 的定义,沿着作用域链找到外层了的 a,接下来,去掉注释:

let a = 1;
(function () {
    console.log(a);	// Uncaught ReferenceError: Cannot access 'a' before initialization
    let a = 3;
})()

注意:这里报错提示是在初始化前不允许读取 a,而不是 a is not defined

可见,由于 let a = 3 在闭包作用域内的变量提升,阻断了函数作用域链的向上延伸。但在闭包内部,尽管 a 发生了变量提升,但是在初始化赋值之前(before initialization)不允许读取

初始赋值

用 var/let 声明的变量在声明时不赋值,值为 undefined

用 const 声明的常量在声明时必须赋值,否则报错

全局作用域

在全局作用域下用 var 声明的变量会被挂载到 window 上,成为 window 对象的属性

在全局作用域下用 let/const 声明的变量不会会被挂载到 window 上,不会成为 window 对象的属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的犟驴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值