我如何在setTimeout中继续保持?

时间:2011-11-22 12:28:59

标签: javascript

此代码的工作原理如何?任何人都帮我理解?

var myArray = ['one','two','three'];

var logAll = function (){
    var long = myArray.length;
    for(i=0;i< long;i++){
        console.log(myArray[i]);
    }
    setTimeout(logAll,50);
}
logAll();

据我说,myArray长度只有3,所以,我的日志必须给我结果为0,1,2。没关系。在我的for循环中,我为logAll函数引入了一个setTimeout,但是logAll函数如何继续调用for循环而不是3次,直到...?有谁帮我理解这个?

如果是这样,为什么这只召唤一次?

var myArray = ['one','two','three'];

    var logAll = function (){
        var long = myArray.length;
        for(i=0;i< long;i++){
            console.log(myArray[i]);
        }

    }
    setTimeout(logAll,50);

5 个答案:

答案 0 :(得分:3)

您始终在setTimeout结束时致电logAll,因此每隔50毫秒就会调用logAll

答案 1 :(得分:1)

此函数(logAll)在启动时调用一次。然后它从数组中获取所有键/值,并在50毫秒后重复该过程,这没有任何意义,但如果您想检查变量更改则可用

  

如果是这样,为什么这只召唤一次?

因为函数只调用一次而不再调用。 setTimeout()仅创建一个函数调用。

答案 2 :(得分:1)

setTimeout行表示等待50ms,然后调用logAll。因为它在logAll中,它将自行运行导致无限循环。

我不确定setTimeout行的用途,所以我要删除它!

答案 3 :(得分:1)

您正在调用logAll 50毫秒,因此它每50毫秒运行一次for循环。因此看起来好像你处于一个永无止境的循环中,但事实上你只是不断地开始循环而你的console.log看起来不会以正确的顺序登录。例如在一个循环完成之前,另一个循环已经开始。

答案 4 :(得分:1)

通过添加setTimeout(logAll,50);,您创建了一个无限循环。

如果您只想记录数组的内容,则必须保留i(以便在下一轮中以i=3开头)或你必须清除阵列。

后者可能更好,因为这可以避免内存泄漏(阵列会增长直到占用所有内存)。

要清除数组,请将length设置为0myArray.length = 0;

[编辑] 在第二个示例中,logAll被调用一次,因为setTimeout()不重复;如果要重复调用函数,则必须在执行函数后再次调用setTimeout()

See the documentation