JS中关于let和var的总结

本文详细探讨了ES6中let和var的差异,包括作用域、变量提升、暂时性死区以及块级作用域的概念。通过阮一峰的教程和方应杭的知乎分享,阐述了let如何解决内层变量覆盖外层变量以及循环计数器的全局污染问题,并强调了块级作用域的重要性。此外,还提到了let的不可重复声明特性及其在实际编程中的应用。

这三个月来的总结都写到了本地,一直没有发布。我从今天开始会陆续写写对前端三大基本功和VUE的知识点总结。文章如果是其他人的观点,我会注明出处。

首先是ES6中的let和var:

一. 阮一峰网站

 let 和 const 命令 - ECMAScript 6入门 (ruanyifeng.com)

总结:

1. let所声明的变量,只在let命令所在的代码块内有效。

     var命令声明的,在全局范围内都有效.

2.let不存在变量提升 ,var存在(var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined)。

3.暂时性死区。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

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

暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

4.let不允许在相同作用域内,重复声明同一个变量。

为什么需要块级作用域?

第一种场景,内层变量可能会覆盖外层变量。

第二种场景,用来计数的循环变量泄露为全局变量。

使用:

1.ES6 允许块级作用域的任意嵌套。

2.内层作用域可以定义外层作用域的同名变量。

3.块级作用域的出现,实际上使得获得广泛应用的匿名立即执行函数表达式(匿名 IIFE)不再必要了。

块级作用域与函数声明

二、方应杭知乎

        我用了两个月的时间才理解 let - 知乎 (zhihu.com)

        更新:关于代码块1的解释:

                (24条消息) let和var的区别_Conso1e的博客-优快云博客

1. 浅显的理解:

  • let 声明的变量的作用域是块级的;
  • let 不能重复声明已存在的变量;
  • let 有暂时死区,不会被提升。

  2.在文章中,用的最多最经典的还是for循环里的i用var和let分别声明,从而理解var和let

重点:

  1. for( let i = 0; i< 5; i++) 这句话的圆括号之间,有一个隐藏的作用域
  2. for( let i = 0; i< 5; i++) { 循环体 } 在每次执行循环体之前,JS 引擎会把 i 在循环体的上下文中重新声明及初始化一次。

这篇文章中对变量提升做了更加详细的说明。

Closing over the loop variable considered harmful | Microsoft Docs

stackoverflow.com

你不知道的JS

本文将会继续更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值