欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

let面试题 博客分类: 教学笔录笔记随笔前端积累 教学笔录笔记随笔前端积累 

程序员文章站 2024-02-09 11:15:28
...

【前言】

    本文谈下常见的一道JS面试题,let声明变量与var的区别,块级作用域等

 

【主体】

    篇幅问题,部分放到文章JS中的let和var的区别里。

    

    (1)面试题:接下来看到面试题

编写一个函数,该函数将遍历整数列表,并在延迟3秒后打印每个元素的索引

   

    (2)错误写法:经常错误写法是这样的:

const arr = [10, 12, 15, 21];
for (var i = 0; i < arr.length; i++) {
  setTimeout(function() {
    console.log('The index of this number is: ' + i);
  }, 3000);
}

   如果运行上面代码,3 秒延迟后你会看到,实际上每次打印输出是 4,而不是期望的 0,1,2,3 。

   为了正确理解为什么会发生这种情况,了解为什么会在 JavaScript 中发生这种情况将非常有用,这正是面试官试图测试的内容。

 

   (3)原因解析:

   原因是因为 setTimeout 函数创建了一个可以访问其外部作用域的函数(闭包),该作用域是包含索引 i 的循环。 经过 3 秒后,执行该函数并打印出 i 的值,该值在循环结束时为 4,因为它循环经过0,1,2,3,4并且循环最终停止在 4。

    (4)解决方案

   1、解决方案有很多种,最简单的一种就是用let方法(将上面的var改为let即可)

const arr = [10, 12, 15, 21];
for (let i = 0; i < arr.length; i++) {
  setTimeout(function() {
    console.log('The index of this number is: ' + i);
  }, 3000);
}

   原因:ES6可以用let定义块级作用域变量,稍后详解

   2、闭包

const arr = [10, 12, 15, 21];
for (var i = 0; i < arr.length; i++) {
  setTimeout(function(i_local){
    return function () {
      console.log('The index of this number is: ' + i_local);
    }
  }(i), 3000)
}

 

 

    (5)拓展:块级作用域

    详情看文章浅谈JS块级作用域

 

 

 

.