var、let、const的区别

ES6中新增了两种声明变量的方式:let、const。

变量与常量

不同点:

  • var和let是变量,赋值后可以修改;
  • const是常量,声明时必须初始化(声明引用类型时,则只有所指向的地址无法改变);

作用域

ES6中增加了块级作用域。
块级作用域使用{}if语句和for语句里面的{}也属于块级作用域。

不同点:

  • var:作用于当前作用域中;
  • let:作用于当前块级作用域中;
  • const:作用于当前块级作用域中;

重复声明

let和const不能重复声明。

变量提升

不同点:

  • var会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined
  • let和const则不会发生;

全局变量与顶层变量

全局变量:作用域为所属的整个程序;

定义全局变量

定义全局变量方式:

  • 在函数外定义;
  • 在函数内定义,但是不加var声明;
  • 使用window.变量名的形式定义;

注:使用let和const声明的全局变量都不会变成全局对象的属性。

《javascript权威指南(第6版)》第5章5.3.1中提到:

var声明的变量是无法通过delete删除的。
浏览器环境中无法被删除的全局变量

// 浏览器中运行
var varVariable = 1
console.log(this.varVariable) // 1
let letVariable = 1
console.log(this.letVariable) // undefined
let constVariable = 1
console.log(this.constVariable) // undefined

浏览器中顶层变量

// Node中运行
var varVariable = 1
console.log(this.varVariable) // undefined
let letVariable = 1
console.log(this.letVariable) // undefined
let constVariable = 1
console.log(this.constVariable) // undefined

Node中顶层变量

在Node中通过var定义的变量不是全局变量

由于Node中所有代码都在当前module中,而module不是全局的,所以需要通过global声明。

顶层对象

顶层对象:

  • 在浏览器中指的是window对象;
  • 在node环境中指的是global对象;

ES6中为了解决顶层对象属性与全局变量混淆的情况,规定:let、const、class声明的全局变量不属于顶层对象的属性,另外为了保持兼容性,var和function声明的全局变量依旧是顶层对象的属性。

暂时性死区

暂时性死区(temporal dead zone,简称 TDZ):在代码块内,使用let、const命令声明变量之前,该变量都是不可用的,这在语法上称为暂时性死区。

var a = 1
if (true) {
  console.log(a)
  let a
}

暂时性死区在浏览器环境中报错

注:“暂时性死区”也导致typeof不是一个百分百安全的操作,即在变量声明之前使用typeof会报错

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值