JS闭包问题

for (var i = 1; i < 5; i++) {
  setTimeout(function(i) {
    console.log(i);
  }, 1000 * i);
}

上面的代码,打印出来为什么是四个undefined,变量i的值为什么传不进去

阅读 2.8k
5 个回答

跟闭包无关,改成这样就可以了:

for (var i = 1; i < 5; i++) {
  setTimeout(function(i) {
    console.log(i);
  }, 1000 * i,i);
}

setTimeout(function[, delay, param1, param2, ...]) 你没有给 functionparam,所以 iundefined

MDN

因为你 function(i) 这里把 i 的声明覆盖了啊。

简单的道理,你调用函数没传参数但在函数内用到了参数

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

可以这样通过闭包来实现,你的代码没有传参

新手上路,请多包涵

楼上正解,如果i作为闭包变量使用,就别再使用同名形参,如果使用形参还要需要传值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题