唯品秀前端博客
当前位置: 前端开发 > JavaScript > 浅谈JS中的let和var的区别以及如何去理解暂时性死区(TDZ)

只要用js的人都对let和var区别应该有所了解,但你真的认识它吗,通常我们可能知道let不能重复定义并且会涉及到代码块概念,接下来通过一些小的demo来理解两者区别以及在实际使用let过程中我们需要注意什么。

示例

1
2
3
4
5
6
let a = 10;
console.log(a); // #1
if(true){
    console.log(a); // #2
    let a = 100;
}

单凭上面代码,你能告诉我#2处打印后的结果吗?如果报错,那报错信息应该说的是啥?结果是:Uncaught ReferenceError: a is not defined。是的,你没看错,报错信息说的是a未定义,很显然开头在全局我们已经定义了a为10,如果去掉let a = 100;这段代码,a可以正常拿到10,你可能会想,为什么不是报错:Uncaught SyntaxError: Identifier a has already been declared(a已声明)?

暂时性死区

用let声明的变量,不存在变量提升。而且要求必须 等let声明语句执行完之后,变量才能使用,不然会报Uncaught ReferenceError错误

ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

结论

通过上面分析我们就能知道为什么a报错是未定义了,首先全局定义let a = 10;没问题,然后通过if做了个判断,其实if块代码就涉及到了代码块概念。然后在if代码块中做了两件事,打印a,和给a重新定义并赋值为100,根据上面暂时性死区概念我们知道:只要是通过let申明了某个变量,整个代码块就开始被锁定,凡事监听到在块变量let未定义之前使用该变量就会报未定义,不管全局是否存在该变量

TDZ可以做点啥

let非常适合用于 for循环内部的块级作用域。JS中的for循环体比较特殊,每次执行都是一个全新的独立的块作用域,用let声明的变量传入到 for循环体的作用域后,不会发生改变,不受外界的影响。看一个常见的面试题目:

1
2
3
4
5
6
7
8
for (var i = 0; i <10; i++) {  
  setTimeout(function() {  // 同步注册回调函数到 异步的 宏任务队列。
    console.log(i);        // 执行此代码时,同步代码for循环已经执行完成
  }, 0);
}
// 输出结果
10...   共1010
// 这里面的知识点: JS的事件循环机制,setTimeout的机制等

如果把var改成let声明:

1
2
3
4
5
6
7
8
// i虽然在全局作用域声明,但是在for循环体局部作用域中使用的时候,变量会被锁定,不受外界干扰。
for (let i = 0; i < 10; i++) {
  setTimeout(function() {
    console.log(i);    //  i 是循环体内局部作用域,不受外界影响。
  }, 0);
}
// 输出结果:
0  1  2  3  4  5  6  7  8 9

小结

ES6的let的代码块作用域概念很好,这也给我们代码提供了一种规范,而不像以前一个var撸全场,走到哪儿数据丢失了要找半天。但可能对于那些代码风格不是很严谨的人来说就有些繁琐了,因为以前很多人写代码自由惯了,慢慢纠正吧。

「梦想一旦被付诸行动,就会变得神圣,如果觉得我的文章对您有用,请帮助本站成长」

分享到:
赞(0) 打赏
谢谢你请我吃鸡腿*^_^*

支付宝扫一扫打赏

微信扫一扫打赏

标签:

上一篇:

下一篇:

相关推荐

0 条评论关于"浅谈JS中的let和var的区别以及如何去理解暂时性死区(TDZ)"

最新评论

    暂无留言哦~~

博客简介

一个关注Web前端开发技术、关注用户体验、坚持更多原创实战教程的个人网站,梦想一旦被付诸行动,就会变得神圣,愿景:成为宇宙中最具有代表性的前端技术类博客。主题源码 

精彩评论

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

站点统计

  • 文章总数: 290 篇
  • 草稿数目: 0 篇
  • 分类数目: 15 个
  • 独立页面: 7 个
  • 评论总数: 981 条
  • 链接总数: 12 个
  • 标签总数: 483 个
  • 注册用户: 2 人
  • 访问总量: 8,826,442 次
  • 最近更新: 2021年1月25日
服务热线:
 173xxxx7240

 QQ在线交流

 旺旺在线