for循环中使用let和var

357 阅读3分钟

前言

hello,大家好,我是丽丽子,今天在网上看到一道面试题觉得不错就分享出来考考大家👣

      var i = 4;
      var data0 = [];
      var data1 = [];
      function foo() {
        for (var i = 0; i < 3; i++) {
          data0[i] = function () {
            console.log(i);
          };
        }

        for (let i = 0; i < 3; i++) {
          data1[i] = function () {
            console.log(i);
          };
        }
      }
      foo();
      for (let i = 0; i < 3; i++) {
        data0[i](); 
        data1[i](); 
      }

答案附上:

image.png

如果做对了的小伙伴,那么恭喜你们,var和let在for循环的区别你们已经完全掌握了!👍 但是对答案有疑问的小伙伴,也不要气馁,因为丽丽子也没有做对😜,其实这道题很基础只是咱们对var声明认识不够,那么就和丽丽子一起学习for循环中使用var和let吧~

这些知识你要知道

for循环基础知识

for (*语句 1*; *语句 2*; *语句 3*)\
{\
*被执行的代码块*\
}
  • 语句 1 (代码块)开始前执行——>变量初始化
  • 语句 2 定义运行循环(代码块)的条件——>条件判断
  • 语句 3 在循环(代码块)已被执行之后执行——>变量更新

for语句的执行顺序:

  1. 先执行语句1 变量初始化(只执行一次)
  2. 再进行条件判断,判断变量是否满足条件;满足则继续执行,不满足跳出循环
  3. 再执行被执行的代码块
  4. 再执行语句3,进行变量更新
  5. 最后重复第二步进行条件判断

let与var的变量声明

var声明变量

  • 变量提升:var声明将会提前到当前作用域的最前面
  • 没有块级作用域:分支和循环语句中使用var声明的变量都是全局的

let声明变量

  • 无变量提升:变量一定要先声明,才能使用
  • 有块级作用域:分支和循环里面的变量都是局部的

预解析

JS引擎运行js代码分为两步: 预解析和代码执行

  1. 预解析:JS引擎会把js代码里所有的 var、function 声明提前到当前作用域的最前面
  2. 代码执行:代码执行 按照代码书写的顺序 从上到下执行

预解析分为变量预解析(变量提升) 和 函数预解析 (函数提升)

  1. 变量提升:所有的var变量声明都提升到当前作用域最前面,但不提升赋值操作
  2. 函数提升:所有的函数声明提升到当前作用域的最前面,但是不提升调用函数操作

在for循环表达式中使用var声明变量

for (var i = 0; i < 3; i++) {
        data0[i] = function () {
            console.log(i);
          };
        }

⚠️需要大家注意的是,在for循环中如果有函数中有循环的变量值,只要不是在这个循环里面直接调用这个函数,则这个循环的变量值就是循环结束的值。

前面提到var声明的变量属于全局变量,而在上述代码中没有直接在循环里面调用这个函数,本次循环结束时i=3,所以i将之前的0,1,2全部覆盖,所以在后续的调用函数时输出的都是3

在for循环表达式中使用let声明变量

for (let i = 0; i < 3; i++) {
     data1[i] = function () {
            console.log(i);
          };
        }

前面提到let声明的变量有块级作用域,为局部变量,这就意味着在每执行一次循环就会产生一个新的作用域,其中存储的变量的值互不干扰,所以在调用函数输出的值就是0,1,2

留在最后

这篇文章就写到这了👣,想要了解更多就多多关注我,持续更新哦~

解题过程纯属个人理解,有错误或不足请留在评论区🙏,码字不易,要是各位宝子觉得不错的话,点个赞再走哦😊~