请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

一个面试题

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

正在回答 回答被采纳积分+3

2回答

慕码人738631 2018-09-17 14:33:53

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

0 回复 有任何疑惑可以回复我~
双越 2017-12-08 20:03:34

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

0 回复 有任何疑惑可以回复我~
  • 提问者 V金龙V #1
    for(var i=0; i<5; i++){
            function fn() {
                console.log(i);  //这里一次递增输出,为什么与上面的代码不一样,这里也是自由变量啊,静态作用域也相同。
            }
            fn();
        }
    回复 有任何疑惑可以回复我~ 2017-12-08 22:08:53
  • 提问者 V金龙V #2
    上面的文本格式不好看,再发一遍。
        for(var i=0; i<5; i++){
            function fn() {
                console.log(i);  
            }
            fn();
        }
        /*这里依次递增输出,为什么与上面的代码不一样,
        这里也是自由变量啊,静态作用域也相同。*/
    回复 有任何疑惑可以回复我~ 2017-12-08 22:10:33
  • 双越 回复 提问者 V金龙V #3
    这里不是异步啊,setTimeout 是异步执行的
    回复 有任何疑惑可以回复我~ 2017-12-09 11:27:53

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信