持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
铃铛说点题外话
上一篇中对于变量提升我们只说了V8引擎是如果造成的,但是还有一些知识点没有说完,放到这一篇来说,包括上一篇提出的问题,函数有没有提升
铃铛说正文
在Es6里面定义变量新增了两个关键字:const和let。这两个变量在这里也做一个详细点的解释吧
var、const和let的区别?
- var:声明变量的作用域在限制在其声明位置的上下文中,而非声明的变量总是全局的;有变量提升;同一个作用域下的变量可以重复声明,新变量会顶替旧变量。
- let:定义的变量受到作用域的限制,存在一个暂时性死区,所以不能进行变量提升;同一个作用域下的变量不能重复命名。
- const:这个关键词声明创建的只是一个指针,一旦创建必须初始化并且不可以对变量类型为基本数据类型的值进行修改,复杂数据类型里面的值可以进行修改(比如对象里面的age),也是存在一个暂时性死区,不能进行变量提升;同一个作用域下的变量不能重复命名
暂时性死区:- 在没有使用let或者const声明变量之前使用变量,对于变量来说就是暂时性死区。
变量提升:会将定义的变量提升到作用域的顶部,不能提升的变量不能在声明前使用。
函数也存在一个提升,函数也可以先调用后定义。究其原因是因为函数类型是复杂数据类型,函数实际上是被存储在堆里面的,定义的函数名字只是一个指针,指向内存地址。
foo()
fucntion foo() {
console.log("foo")
}
这段代码因为函数存在一个提升,最终输出结果为foo。V8引擎也会对函数进行一个解析生成AST抽象语法树,会被解析为如下(这里的指针命名为随意虚拟命名):
var globalObject = {
String: "类",
foo: 0xa00
}
跟铃铛说再见
关于变量提升和函数提升我相信大家心里应该有一个初步的认识了,下一篇我会找几个例子对提升做一个巩固练习。也会更详细的通过例子对变量的创建到销毁的过程做一个大概的讲述。