2011-04-09 102 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调用的情况下,可能需要考虑其他事情。