JS由浅入深的一道面试题
前言: 前端面试中,JS是一大热点,下面就跟着小编来看一下一道由浅入深的面试题吧。 正文: 请说出下面代码的执行结果: for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000); } ---------------------揭晓答案了--------------------- 因为JS是单线程的语言,所以遇到异步函数的时候,setTimeout会被放到等待队列中,当主线程上的函数执行结束之后,再去执行等待队列中的函数,如下图所示: 当主线程执行完毕,此时变量i已经变成5,所以上述代码的结果是输出5个5。 问题来了:如果我想输出01234,应该如何实现呢? 方式一:let for (let i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000); } 这里就要说一下let和var的区别了,let有块级作用域,就是一个{}的作用域,而var就没有块级作用域,只有函数作用域和全局作用域,所以使用var声明的话会打印出5个5,用let声明的话会打印出01234。 方式二:函数自执行,闭包 for (var i = 0; i < 5; i++) { (function