先简单的说一下const和let:
关于let:
一.作用
与var稍微类似,用于声明一个变量
二.特点
1.在块级作用域内有效,存在暂时性死区。
2.不能重复声明
3.不会预处理(预解析),不存在变量提升
三.应用
循环遍历加监听(流程处理)
关于const:
一.作用
定义一个常量
二.特点
1.不能修改(变量指向的那个内存地址不能改动)
2.声明必须赋值
3.除了不能改变指针,其它特点同let一样
三.应用
保存不用改变的数据
让我们带着种种疑问,来详细的说一下吧!。o( ̄▽ ̄)o
为什么说"使用let取代var是必然的结果"?
为什么会出现暂时性死区?预解析?................
关于const和let的问题详情:
预解析
js引擎运行js分为两步:预解析--->代码执行
1.预解析:js引擎会把js里面所有的var还有function提升到当前作用域的最前面
2.代码执行:按照代码书写的顺序从上往下执行
变量预解析(常称为变量提升)和函数预解析(常称为函数提升)
1.变量提升:就是把所有的变量声明提升到当前作用域最前面 不提升赋值操作
2.函数提升:把所有的函数声明提升到当前作用域的最前面 不调用函数
如果搞懂了这些问题,来做点题目:
解释以下打印的结果,解释一下为什么?
1.坑点
console.log(num);//undefined
var num=10;
2.坑点
fun();//报错
var fun=function(){
console.log(22)
}
结合以上观点,便知道了。
为什么说"使用let取代var是必然的结果"?
暂时性死区
1.简单说
在代码块内,使用let、const命令声明变量之前,该变量都是不可用的。
这在语法上,称为暂时性死区。
2.详细说(某知乎说法)
ES6规定,let/const 命令会使区块形成封闭的作用域。若在声明之前使用变量,就会报错。总之,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为 “暂时性死区”( temporal dead zone,简称 TDZ)。
3.深度说(ES6标准)
ES6标准中对let/const声明中的解释,当程序的控制流程在新的作用域(module function 或 block 作用域)进行实例化时,
在此作用域中用let/const声明的变量会先在作用域中被创建出来,
但因此时还未进行词法绑定,所以是不能被访问的,如果访问就会抛出错误。
因此,在这运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区。
来看看以下代码:
typeof a // ReferenceError: a is not definedlet a
let a
TDZ 也意味着 typeof 不再是一个百分之百安全的操作。
指针指向
let创建的变量
是可以更改指针指向(可以重新赋值)。
但const声明的变量
是不允许改变指针的指向。
详情:
实际上,const保证的
并不是变量的值不得改动,
而是变量指向的那个内存地址不能改动。
对于基本类型的数据(数值、字符串、布尔值),
值就保存在变量指向的那个内存地址,
因此等同于常量。
但对于引用类型的数据,变量指向数据的内存地址,保存的只是一个指针,
只能保证这个指针是固定不变的,
至于它指向的
数据结构
是不是可变的,就完全不能控制了。
最后再说一下:
昨日所有的前行,终成为明日惊喜的铺垫!
让我们一起加油吧!!![]~( ̄▽ ̄)~*