Javascript - 变量(扩展篇)

162 阅读2分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

上一章我们已经基本的了解了变量,这篇我们将带你进阶Javascript的变量,本章大概包括let和const的特性、以及他们和var的区别

在ES2015(ES6)新增加了两个重要的JavaScript关键字 - let 和 const

ES6是什么?

全称ECMAScript 6,在2015年六月正式发布了,是Js下一代语言的标准,简单来说,ECMAScript是JavaScript语言的国际标准。

let、const、var

  • let和const声明的是局部变量,不会挂载在windows上,var声明的变量会
var a = 1
console.log(a, window.a)  // 1, 1


let a = 2
console.log(a, window.a)  // 2, undefined
  • var 声明的变量存在变量提升,let和const没有

变量提升我理解就是把声明变量的代码提升到当前作用域的顶层,看下面代码:

console.log(a)   // undefined
var a = 6

按照逻辑来说,提升的话应该能够得到变量a,但是为啥没有呢,看下面的代码执行顺序

var a
console.log(a)
a = 6

代码的执行顺序是不是跟你想象中的不一样

  • 暂存死区 下面这串代码. 在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域找变量a,而这时,还未到声明时候,所以控制台Error:a is not defined
var a = 1
if(true) {
    a = 2
}
  • 同一作用域下let和const不能重复声明变量,而var可以
var a = 1
var a = 2

let b = 2
let b = 2  // Identifier 'b' has already been declared
  • const 一旦声明,必须赋值,不能使用null占位
    声明之后不能在修改
    如果声明的是复合数据类型的话可以声明

额外知识点:声明变量有var和没var的区别

var test = 1

在当前作用域声明变量,如果是在全局声明的话就是全局变量

test = 1

这行代码其实是对属性的一个赋值操作,首先,他会在当前作用域链中解析test,如果找到就赋值,如果没找到就在顶层(window)中创建并赋值,他并不是声明了一个全局变量,而是创建了一个全局对象的属性

在严格模式(Strict Mode)中,不允许使用未声明的变量