js问题,undefined

image.png
如下面这段代码,为什么执行后的结果是undefined。我不理解

function fetch() {
    for (var i = 0; i < 5; i++) {
        setTimeout(function (i) {
            console.log(i);
        })
    }
}
fetch()
阅读 3.2k
5 个回答
setTimeout(function (i) {
    console.log(i);
})

这里的i没有任何地方传入,所以就是undefined
https://developer.mozilla.org...
你希望传入for循环的i的话可以这么用:

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

等同于:

function fetch() {
    var myFun = function (a) {
        console.log(a);
    }
    for (var i = 0; i < 5; i++) {
        setTimeout(myFun)   //没传参
    }
}
fetch()
function fetch() {
    for (var i = 0; i < 5; i++) {
        setTimeout(function (a) { // 你原来匿名函数形参是i,其实这个i和外围的i没有任何关系,这里用a,区分更明确
            console.log(a);
        },0,i) // 这里在setTimeOut中显式调用匿名函数,并把i当前值传递给了。你原来就没有传递值,所以匿名函数执行的i就是undefined 
    }
}
fetch()

需要注意,setTimeOut支持向调用函数传参是需要浏览器支持的,比如IE9及更早的IE都不支持。

欢迎进入坑多的世界。

试试下面的代码:

function fetch() {
        for (var i = 0; i < 5; i++) {
            setTimeout((function (i) {
                console.log(i);
            })(i))
        }
    }

因为你声明了一个形参,但你并没有传参数进去,你打印的那个i并不是循环中的i哦,是你声明的形参哦

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