博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解let和var的区别(暂时性死区)!!!
阅读量:6497 次
发布时间:2019-06-24

本文共 1246 字,大约阅读时间需要 4 分钟。

首先我们应该知道js引擎在读取js代码时会进行两个步骤:

  • 第一个步骤是解释。
  • 第二个步骤是执行。

所谓解释就是会先通篇扫描所有的Js代码,然后把所有声明提升到顶端,第二步是执行,执行就是操作一类的。

我们先来看个简单的变量提升案例吧

a = 'javascript';    var a;    console.log(a);//'javascript'
console.log(b);//undefined    var b='javascript'

遇到 script 标签的话 js 就进行预解析,将变量 var 和 function 声明提升,但不会执行 function,然后就进入上下文执行,上下文执行还是执行预解析同样操作,直到没有 var 和 function,就开始执行上下文。如:

a=5;show();var a;function show(){};

预解析:

function show(){};var a;a=5;show();

需要注意都是函数声明提升直接把整个函数提到执行环境的最顶端。

那么let/const和var又有什么区别呢??

  • let/const是使用区块作用域;var是使用函数作用域。
  • 在let/const声明之前就访问对应的变量与常量,会抛出ReferenceError错误;但在var声明之前就访问对应的变量,则会得到undefined。
console.log(aVar) // undefinedconsole.log(aLet) // causes ReferenceError: aLet is not definedvar aVar = 1let aLet = 2

会出现这样的情况是因为let/const拥有“暂时性死区(TDZ)”。

什么是暂时性死区?

当程序的控制流程在新的作用域(module, function或block作用域)进行实例化时,在此作用域中的用let/const声明的变量会先在作用域中被创建出来,但因此时还未进行词法绑定,也就是对声明语句进行求值运算,所以是不能被访问的,访问就会抛出错误。所以在这运行流程一进入作用域创建变量,到变量开始可被访问之间的一段时间,就称之为TDZ(暂时死区)。

结论:let/const声明的变量,的确也是有提升(hoist)的作用。这个是很容易被误解的地方,实际上以let/const声明的变量也是会有提升(hoist)的作用。提升是JS语言中对于变量声明的基本特性,只是因为TDZ的作用,并不会像使用var来声明变量,只是会得到undefined而已,现在则是会直接抛出ReferenceError错误,而且很明显的这是一个在运行期间才会出现的错误。

ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易啦~

转载地址:http://pijyo.baihongyu.com/

你可能感兴趣的文章
this关键字
查看>>
【C#小知识】C#中一些易混淆概念总结(三)---------结构,GC,静态成员,静态类...
查看>>
CC2540 OSAL 学习其中原理,以及 给任务 添加 一个事件(定时发送串口消息)
查看>>
MySQL安装使用的2个问题
查看>>
02-NLP-01-python正则表达式
查看>>
AjaxFileUpload文件上传组件(php+jQuery+ajax)
查看>>
向量的基本运算
查看>>
the folder is already a source folder.
查看>>
2014年度加班时间
查看>>
Entity Framework Tutorial Basics(13):Database First
查看>>
mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离
查看>>
静态属性和静态方法2 - C++快速入门22
查看>>
用Ajax请求服务器的图片,并显示在浏览器中(转)
查看>>
带有用户名密码验证的远程文件下载
查看>>
【cocos2d-js官方文档】九、cc.loader
查看>>
123
查看>>
apache开启虚拟主机 并进行配置
查看>>
三大特性
查看>>
nexus 4 下 DualBootInstallation 安装 ubuntu touch
查看>>
python-docx操作
查看>>