2015-02-09 74 views
2

爲什麼我們需要一個函數傳遞到Java腳本的setTimeout https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeoutJs:setTimeOut沒有函數參數?

爲什麼我們不能做到像

setTimeOut(1000); 

SG簡單的我可以傳遞一個空的或不存在的功能在那裏?

我想在每次迭代後等待for循環。

+2

你是說像PHP中的sleep()方法? Javascript中沒有這樣的東西。你必須用'setTimeOut'或'setInterval'來完成。 – Michelangelo 2015-02-09 09:59:45

+0

是的:)在PHP中sleep()非常方便。 – giorgio79 2015-02-09 10:09:25

+0

我知道對...希望他們正在努力:) – Michelangelo 2015-02-09 10:33:50

回答

5

Javascript是單線程的。您可以使用setTimemout推遲一個操作,但該線程將繼續。所以

function some() { 
    doStuff(); 
    setTimeout(otherStuff, 1000); 
    doMoreStuff(); 
} 

將運行doStuffdoMoreStuff隨後,並且將第二後運行otherStuff。這就是爲什麼使用setTimeout作爲延遲本身是無用的和不可能的。如果doMoreStuff應推遲,你應該對於延遲迴調:

function some() { 
    doStuff(); 
    setTimeout(doMoreStuff, 1000); 
} 

或兩者otherstuffdoMoreStuff延遲:

function some() { 
    doStuff(); 
    setTimeout(function() { 
       otherStuff(); 
       doMoreStuff() 
      }, 1000); 
} 

也許我的回答是this SO-question有用了。

+0

@Kooilnc在這篇文章中,所有這些解決方案都很好嗎?:[Post](http://stackoverflow.com/questions/5226285/settimeout-in-a-for-loop-and-pass-i-as-value) 。您發佈了一個很好的解決方案,但鏈接中的解決方案僅適用於兩次迭代。通過兩次以上的迭代,它會繼續發射,並讓你回到隨機數。瀏覽器在過去幾年中如何處理循環中的超時有什麼變化? – Michelangelo 2015-02-09 10:32:45

+0

@Mikey:檢查我鏈接的問題的答案,並檢查該答案中的jsfiddle(http://jsfiddle.net/KooiInc/k47rw5o4/) – KooiInc 2015-02-09 10:57:55

+0

謝謝。很多解釋。 – Michelangelo 2015-02-09 11:02:58

2

setTimeout在事件循環中註冊一個。當JavaScript完成所有當前指令後,它將返回到事件循環並等待事件發生。當它發生時,它會調用回調函數,這是您傳遞給setTimeout的函數。

做一個for循環與setTimeout的,做這樣的事情:

function loop(i, n) { 
    doStuff(); 
    if (i < n) { 
     setTimeout(function() { 
      loop(i+1, n); 
     }, 1000); 
    } 
}; 
loop(0, 10); 

其中i爲當前迭代,n是最大迭代

當JavaScript是不是在事件循環,即它運行的代碼,它使整個瀏覽器無響應。只需怠速一秒鐘就可以做到這一點,所以如果你在循環中迭代10次,瀏覽器將在10秒內無響應。

1

- >setTimeout(callbackFunction[, interval])

這可以被理解爲你準備了指定的時間後調用具有指定名稱(由您提供)的功能。

- >你不能做這樣的setTimeOut(1000);因爲1000會回調函數來處理作爲setTimeout()的第一個參數是回調函數。

你不能這樣定義一個函數

function 1000() { // Code Resides here. }

因爲Java腳本不允許這些類型的函數名。

- >可以傳遞匿名函數來setTimeout()

setTimeout(function() { // Code resides here. }[, interval]); 上述功能碼會在給定的時間間隔之後執行。如果沒有給出時間間隔,則立即執行。

注: - 在方括號 [,] 是可選的通過給定的參數

- >您可以參考您的使用下面提到的線程:JavaScript sleep/wait before continuing

由於這個線程包含一個函數定義,就像其他語言sleep()

相關問題