一个面试题

来源:16-11 作用域和闭包--解题-代码演示

V金龙V

2017-12-08

/*
为什么输出5个5?,setTimeout里面不是有一个函数吗?,所以函数里面的
i的作用域和for循环的i的作用域是不一样的,一个函数作用域,一个是全局作用域,
所以函数里面的i为啥不是依次递增呢?
*/
for(var i=0; i<5; ++i){
  setTimeout(function () {
      console.log(i);
  },500);
}

写回答

2回答

慕码人738631

2018-09-17

setTimeout()异步处理,i自由变量在其上一层执行后为5,此时i=5

0
0

双越

2017-12-08

“一个是函数作用域”—— 理解不对,i 得在函数中定义,才算是函数作用域的,否则算是自由变量。

0
6
V金龙V
回复
双越
哦,我懂了,原来只是循环推入异步队列,但是还没执行函数,等到执行的时候,自由变量 i 的赋值都是5了。
2017-12-09
共6条回复

BAT大牛带你横扫初级前端JavaScript面试(第二版)

BAT高级前端工程师亲授,结合真实面试题,提高面试成功几率

4268 学习 · 817 问题

查看课程