var定义的是全局的变量,挂载到window上的。

而let则是定义的局部变量/块变量。

下面以一个循环为例子:

JS易错点:关于let和var在循环中造成的影响。JS易错点:关于let和var在循环中造成的影响。

看不出区别?

没事,我们继续看,想想var是全局变量,那么挂载到window上后。执行完是否能访问到该全局变量?答案当然是能。那么let定义的,for执行完后能访问吗?我们来看看一下代码:

JS易错点:关于let和var在循环中造成的影响。

JS易错点:关于let和var在循环中造成的影响。

JS易错点:关于let和var在循环中造成的影响。

这下懂了let和var的区别了吧。

我们再来看一个let和var中比较容易出错的问题:

JS易错点:关于let和var在循环中造成的影响。

嗯,这里的setTimeout函数打印的没毛病。

那么我们把setTimeout放入循环中试试:

JS易错点:关于let和var在循环中造成的影响。

JS易错点:关于let和var在循环中造成的影响。

JS易错点:关于let和var在循环中造成的影响。

先看let打印的是123,想想为什么,这里给出解释:需要js环境和作用域的问题。

JS易错点:关于let和var在循环中造成的影响。

再看看var:

 JS易错点:关于let和var在循环中造成的影响。


扩展:如何模拟出var的伪块作用域 

思路很简单,通过立即执行函数,把var i 的值再每次循环中传递到立即执行函数中,从而立即执行函数中的setTimeout不管延迟多秒,取得的都不是全局window的i,而是每一次循环叠加传递的i的副本形参。

这里的和go的闭包思想是差不多的。

JS易错点:关于let和var在循环中造成的影响。

 

这样就模拟出了let的效果。

JS易错点:关于let和var在循环中造成的影响。

当然形参命名可以不同,换个名字你可能更好理解:

JS易错点:关于let和var在循环中造成的影响。

再说一下,闭包是指函数可以访问到其他函数作用域的变量。

看下面,子函数可以访问到父级函数的变量,从而构成了js的环境和作用域。这里的环境的概念是非常重要的,这样就延长了函数环境生命周期。

重点:JS函数环境

JS易错点:关于let和var在循环中造成的影响。

JS易错点:关于let和var在循环中造成的影响。

相关文章:

  • 2021-11-15
  • 2022-01-28
  • 2021-07-17
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-27
猜你喜欢
  • 2021-12-15
  • 2022-12-23
  • 2021-11-02
  • 2021-08-27
  • 2022-12-23
  • 2022-12-23
  • 2021-11-05
相关资源
相似解决方案