2011-04-09 97 views
15

試圖用Javascript而不是jQuery來思考,所以我想知道我是否正確地做了這件事。Javascript for循環回調?

我想在迴路完成時有一個回調。這是正確的方式嗎?

for(var i = 0; i < divs.length; i++) { 

    /* do some stuff */ 

    if (i === (divs.length - 1)) { /* call back */ } 

} 

我應該補充一點,我並不是說像循環完成時那樣的JSON請求回調。

+5

打擾我的無知,但我不明白。如果你想在循環結束時調用它,爲什麼不在**循環內而不是在循環內調用**? – Aleadam 2011-04-09 02:08:06

+0

如果你打算用JavaScript來思考,那就去做吧。做你的循環,然後調用你的函數。 – JAAulde 2011-04-09 02:11:41

回答

18

爲什麼不說你真正的意思,並調用回調循環後

function thing_with_callback(divs, callback) { 
    for(var i = 0; i < divs.length; i++) { 
     /* do some stuff */ 
    } 
    callback(); 
} 
+1

,因爲那樣會很荒謬。加上如果你想在調試器中交互編輯我會怎麼樣? – 2011-04-09 02:55:12

+0

從技術上講,如果數組是空的,那麼它就不是等價的,因爲它仍然會運行。儘管通過添加if語句很容易解決。 – 2011-04-09 03:33:43

+0

@Matthew:問題是「當我的循環結束時,我想要回調。」所以將'callback();'放在循環之外是唯一的方法,並且不需要'divs.length'的條件。 – 2011-04-09 03:40:37

20

爲清楚起見,你應該@畝的答案去,但如果你真的必須包括for結構中的回調,您可以用逗號*:

for(var i = 0; 
    i < divs.length || function(){ /* call back */ }(), false; 
    i++) { 

/* do some stuff */ 

} 

*作爲在this fascinating article解釋。

+0

該文章的+1! – Will 2013-02-23 02:39:12

8

只是爲了讓codelahoma的答案更簡單,你可以直接從你的回調函數中返回false。 (以避免再次執行循環代碼)

for(var i = 0;i < divs.length || function(){ /* callback */ return false;}();i++){ 
/* loop code */ 
} 
+0

我的例子沒有做額外的循環評估。 ','運算符評估兩個操作數並返回右邊的結果。現在注意到我在RHS上使用了一個總是假的表達式,並且已經編輯來反映這一點。 – codelahoma 2012-02-14 06:57:14

+0

如果您要添加,請使用修改而不是新的答案。 – haykam 2017-09-04 23:19:53

5

在我看來,問題是關於JavaScript代碼的執行順序。而答案是:

是的,你可以把回調外因爲JavaScript代碼是執行逐行。在異步ajax調用的情況下,可能需要考慮其他事情。