let / const 的基本使用

109 阅读5分钟

在es5中,我们声明一个变量的时候使用的都是var

varible 变量

从es6 开始,新增了两个关键字来声明变量 let,const

let const 确确实实给javascript 带了一些不一样的东西

从直观的角度来说 没有太大的区别,都是用来声明变量的

var label = 'bar';

它们两个具体的区别

const 是声明了一个常量

一旦给我们赋完值以后就不能进行修改了

只能会进行一次默认的修饰符

不能赋值给一个常量值的变量

const 本质上传递的值不能被修改,如果传递的是一个引用类型的值,那么这里的值就是可以进行修改的了

这里实际上保存的是一个内容的地址

在内存中存放入地址,这里的const是地址不能发生改变

这里修改的是通过引用来进行对象内部属性的修改

可以通过引用去修改对象内部的属性是可以的

image.png

var 是可以进行重复的定义的

let/const 在同一个作用域下面是不能重复定义的

image.png

在声明之前不能进行访问,它们是没有作用域提升的

代码解析的时候就会创建出来

image.png

这些变量被创建在包含他们的词法环境被实例化的时候,但是不可以访问它们,知道词法绑定的时候才会被求值

在创建执行上下文的时候会创建词法环境,这些变量是被创建的,但是不能被访问的

只有我们进行赋值求值的时候才会进行绑定

image.png

在声明变量的作用域中,如果这个变量可以在声明之前可以访问到,就称之为作用域的

提升,这个就不是作用域提升的

作用域提升是在变量没有被创建出来的时候使用

let-const 和 window的关系

image.png

如果在vo里面使用var声明一个变量的话

当js加载的时候会放入到window对象里面去的

可以使用window.属性名的方式来进行获取

image.png

当声明变量或者是函数的时候,会进行一个绑定,绑定到ve环境里面的进行记录

VE VO

在最新的标准的时候是叫一个ve了,现在不是等于

image.png

这里依然会有这样的一个东西的,叫做ve 变量环境

ECMA 规范,每个浏览器都需要去使用这样的一种规范来实现

只需要去实现这样的一种功能就可以了

image.png

VaribleMap,将这些放到这个对象里面去,这里的go,window 指向

的是同一个对象

hashMap 是用C++ 来实现的哈希表

在v8引擎中,做的就是这样的一个事情

image.png

在v8引擎中没有创建hashmap对象将内容进行保存

将声明的let / const 的变量进行保存

var window对象都是浏览器环境中对于变量进行的保存

let,const 和 var 之间是没有什么关系的

let const 定义的变量不会保存在window中,而是保存在ve中(变量环境)

保存在variable evonment中

image.png

块级作用域的项目

以前是window对象 和 go对象是相等的

现在是环境里面window 和 go对象持平

image.png

var 中的块级作用域

在es5中是没有块级代码块的概念的,只有全局作用域,和局部作用域

在es6中有了块级作用域的概念

在es6中 var 声明的块级作用域是无效的是没有效果的

let const function class 块级作用域是有效的

image.png

为了兼容,没有块级作用域的

每一个浏览器的实现都是不一样的

每一个浏览器对于规则的实现都是不一样的

这里就是一个代码块了

这里的块级作用域对于var 是没有效果的,但是对于使用let 定义的数值是有效果的

if switch for 有块级作用域

这里访问不到全局的

通过函数形成这样的一种作用域的形式

for语句的代码也是块级作用域

image.png

访问到的是块级的作用域

es6中的块级作用域

使用let 来进行定义的会形成块级作用域

因为使用var 定义变量会进行报错的操作的

暂时性死区的概念

从mdn上面找到了很多的不太常用的用法

使用promise 形成这样的东西

promise \ await \ anync \ generator \ proxy \ refect \ module

回顾复习

1 let / const 没有作用域的提升

2 let / const 是会提前进行创建的,但是没有办法进行访问

认为是没有作用域提升的

let , const 不会在window 上进行访问

image.png

v8 引擎会把let const var保存在variable 变量中,这个是一个

以 key value 进行保存的数据

VariableMap 有点类似于java里面的Hashmap

这里最后讲到的一个知识点

现在有了块级的作用域

GO 作用域 AO 作用域

image.png

如果函数可以访问的话,是引擎做了处理

一个是同步任务,一个是异步任务

块级作用域的应用场景

因为这里没有块级作用域的话,用户在访问i的时候,使用的是上层

全局的作用域,做了一个遍历,对应的解决方案

没有let const 关键字的话,可以在这里使用块级函数