2011-11-22 40 views
0

这段代码如何工作?任何人都能帮助我理解?根据我的说法,myArray的长度只有3,所以,我的日志必须给我的结果为0,1,2。没关系。在我的for循环中,我为logAll函数引入了setTimeout,但是如何logAll函数继续调用for循环而不是3次,以至于......?任何人都能帮助我理解这一点?我如何在setTimeout中保持长久?

如果是这样,为什么这只是调用一次?

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); 

回答

3

你保持在logAll结束通话setTimeout,所以它不断给你打电话logAll每隔50ms。

+0

问题更新.. – 3gwebtrain

+1

@ 3gwebtrain我很困惑。为什么它只在第二个代码中运行一次?因为它在'setTimeout'结尾处被调用一次,并且再也不会被调用。一个'setTimeout'超时,调用给它的方法,就是这样。 –

+0

在第一个函数中,我没有在循环内部保留“setTimeout(logAll,50);”,这就是为什么我很困惑。我的函数只调用一次,以及它一次调用内部函数..那么如何内部函数调用继续? – 3gwebtrain

1

该函数(logAll)在启动时调用一次。然后它获得阵列中的所有键/值,并且在50ms后它重复该过程,这是没有意义的,但是如果想要检查变量变化则可用

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

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

+0

如果我放置setTimeout(logAll,50);在一个函数内部,那么它会继续调用? - 这是对的吗? – 3gwebtrain

+0

是的。在问题被调用之后,setTimeout再次执行,再次执行该函数......等等。这就是所谓的递归 –

+0

是的,明白。谢谢。 – 3gwebtrain

1

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

我不确定setTimeout行的目的,所以我会删除它!

+0

为什么要删除它?一些无限循环也是有用的 –

+0

好吧,在这种情况下,我假设它不是所需的行为。 –

1

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

1

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

如果你想记录只有内容的数组,你要么必须保持i(这样你在下一轮与i=3开始),或者你必须清除阵列。

后者可能更好,因为这样可以避免内存泄漏(数组会增长直到需要所有内存)。

要清除该阵列,请将length设置为0myArray.length = 0;

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

See the documentation

+0

问题更新.. – 3gwebtrain