【问题标题】:Why does this Javascript return undefined?为什么这个 Javascript 返回未定义?
【发布时间】:2012-05-16 09:07:14
【问题描述】:
var linksList = [
   "http://a.com",
   "http://b.com",
   "http://c.com",
]

for (var i=0; i<linksList.length; i++) {
    setTimeout(function() {
        console.log(linksList[i]); 
    }, 3000);
}  

我将其粘贴到 Chrome 检查器中,它会因任何原因返回一个数字(它似乎是一个完全随机的数字?)...然后它等待...然后返回 3 个“未定义”控制台错误。

【问题讨论】:

    标签: javascript loops for-loop dom-events settimeout


    【解决方案1】:

    使用闭包:

    for (var i=0; i<linksList.length; i++) {
        (function(i){
           setTimeout(function() {
              console.log(linksList[i]); 
           }, 3000);
        })(i);
    }
    

    你的问题是,当setTimeout的回调被调用时,i = linksList.length已经是,所以你正在输出:

     console.log(linksList[ linksList.length ]); 
    

    3 次,其中linksList[ linksList.length ]undefined

    【讨论】:

    • 我认为它是可用的,因为它不是在嵌套函数中创建的?嗯。谢谢。我想我将不得不阅读更多内容
    • 嗯......它现在可以工作了,但它同时在控制台中记录它们(至少现在没有错误。任何想法?)
    • @Tallboy 由于所有setTimeout 函数都设置在大致相同的时间和相同的延迟(3000ms),回调将在大致相同的时间被调用。如果您希望回调调用之间有一些延迟,请在 setTimeout 函数上指定不同的延迟。例如,使用setTimeout(function(){}, 3000*(i+1)),将使用3000ms 延迟调用回调。
    猜你喜欢
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    相关资源
    最近更新 更多