美文网首页
一个经典的闭包面试题

一个经典的闭包面试题

作者: 本一和他的朋友们 | 来源:发表于2018-10-28 17:40 被阅读12次

Shut up, show me the code!!!

function showBiBao() {
    for (var i = 0; i < 5; i++) {
      setTimeout( function timer() {
          console.log(i);
      }, 1000 );
    }
    console.log(i)
}
// 会输出什么
showBiBao()

会用到的两个知识点:

闭包
setTimeout

提示:
这个代码是有bug的,怎么解决?

解决方法:

第一步:先找出bug原因
1.1:for循环5次,那么应该设定了5个定时器,这个没错
1.2:setTimeout等待for循环执行完成后立即调用定时器
1.3:setTimeout被放在了队列的数据结构中(for循环),等待上下文的代码运行后再执行定时器,此时运行定时器,变量i已经变成了5(此时5个定时器的i都是5),所以输出全是5

第二步:怎么解决?
2.1:需要把每个定时器访问的变量独立起来,改变i的作用域
2.1:可以用闭包实现这个目的:在for循环里写一个闭包
2.3:show code

function showListNumber() {
    for(var i = 0; i < 5; i++) {
        (function(i) {
            setTimeout(function timerr() {
                console.log(i)
            }, 1000)
        })(i)
    }
    console.log(i)
}
showListNumber()

第三步:还能怎么做?
3.1:改变i的作用域就可以消除bug
3.2:可以用let声明一个仅对当前{}(块作用域)内有效的变量。

function useLetChange() {
    for (let i = 0; i < 5; i++) {
      setTimeout( function timer() {
          console.log(i);
      }, 1000 );
    }
}
useLetChange()

相关文章

  • 【JS】总算能把闭包经典面试题真的讲清楚了

    闭包的经典面试题 说到闭包,那么这个经典的闭包面试题,大家肯定都很熟悉: 这个例子当中为什么i输出的都是5呢?能够...

  • js闭包问题

    javascript 闭包的概念,闭包的作用,闭包经典面试题详解(配图解) 函数作用域(闭包前置知识) 要彻底弄懂...

  • 闭包1(基础)

    (什么是闭包?闭包的作用?闭包的缺陷?) (闭包的几种可能的应用场景) (闭包与内存泄漏,有关闭包的面试题) 推荐...

  • 关于闭包 vue3 防抖 节流

    闭包好像成了面试题必考,干脆就学一下。我暂时理解的闭包:一个函数中嵌套着另一个函数,这个函数就是闭包。闭包不会内存...

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • Python闭包

    闭包 = 环境变量 + 函数 调用闭包内部的环境变量 闭包的经典误区 闭包与非闭包实现人类走路 非闭包 闭包

  • 文摘-20170305

    前端 释义图例详解那道setTimeout与循环闭包的经典面试题js中proto和prototype的区别和关系?...

  • Python入门与进阶(11-11)

    11-11 一个事例看看闭包11-12 闭包的经典误区

  • JavaScript闭包之for循环

    之前讲了最简单的闭包,然而闭包最经典的是那个for循环,几乎每一个想要理解闭包的都会遇到这个例子,每一个讲解闭包的...

  • 一个经典的闭包面试题

    Shut up, show me the code!!! 会用到的两个知识点: 闭包setTimeout 提示:这...

网友评论

      本文标题:一个经典的闭包面试题

      本文链接:https://www.haomeiwen.com/subject/lthmtqtx.html