2012-06-20 47 views
0

请原谅我的努力,因为我是新来的Javascript和循环的世界,但我不知道如何最好地在JavaScript中接近for loops。希望对for loops的理解将有助于揭示其他类型的循环。如何在JavaScript中执行循环?

示例代码

for (var i=0; i < 10; i=i+1) { 
    document.write("This is number " + i); 
} 

我的理解是,当i已初始化,它为0的值,其然后与条件< 10评估开始。如果小于10,它的执行语句document.write("This is number + i);一旦执行了上述语句,只有它由1

指南我已经咨询递增的下一个值;

  1. http://www.functionx.com/javascript/Lesson11.htm
  2. http://www.cs.brown.edu/courses/bridge/1998/res/javascript/javascript-tutorial.html#10.1
  3. http://www.tizag.com/javascriptT/javascriptfor.php

现在在http://www.functionx.com/javascript/Lesson11.htm指导似乎表明,否则即

要执行这个循环,启动条件检查。这通常是计数开始时的初始值 。接下来,测试条件 ;这个测试确定循环是否应该继续。如果 测试呈现真实结果,则表达式用于修改循环并执行Statement。在声明执行后,循环重新启动。

引发我的线路是If the test renders a true result, then the Expression is used to modify the loop and the Statement is executed。似乎推断出因为0小于10,所以增量表达式被修改为0 + 1,并且然后例如执行document.write

我的问题

什么是解释for循环的正确方法是什么?我自己的理解是否正确?对其他编程语言适用同样的理解,例如PHP,Perl,Python等?的

+0

它应该像一个for循环在C和Java中的工作方式一样工作。我猜最后的来源是错误的? – nhahtdh

+0

[这里是如何循环工作的参考](http://stackoverflow.com/a/6853283/497418)。我知道链接的问题是关于* Java *,但它们以相同的方式工作。当你添加“continue”语句时,有一点细微差别,但至少这是一个开始。 – zzzzBov

+0

您对语言问题的主要参考**总是** [ECMA-262](http://es5.github.com/#x12.6.3)(请参阅Felix的回答)。其他参考可能会有帮助,但也可能包含错误和错误。 – RobG

回答

2

你引用源是错误的,我们可以证明这一点......

的for循环都有一个可被执行的四个独立块的基础:

为(initialise; condition; finishediteration) {iteration}

幸运的是,我们可以在每个块中执行一个函数。因此,我们可以创建登录到控制台时,他们执行像这样四个功能:

var initialise = function() { console.log("initialising"); i=0; } 
var condition = function() { console.log("conditioning"); return i<5; } 
var finishediteration = function() { console.log("finished an iteration"); i++; } 
var doingiteration = function() { console.log("doing iteration when `i` is equal", i); } 

然后我们可以运行以下,这使上述功能为每块:

for (initialise(); condition(); finishediteration()) { 
    doingiteration(); 
} 

KABOOM。作品。

如果您查看使用Mac的Safari上,那么你可以苹果Alt键 + 和复制上述两个片段,从而,进入控制台,并看到结果这个网页。

编辑,额外的信息....

而且......最终迭代方框是可选的。例如:

for (var i=0; i<10;) { 
    console.log(i); i++; 
}; 

确实有效。

+0

不知道我可以调用你所例举的功能。 – PeanutsMonkey

+0

您是否介意在每个函数中进行详细描述?例如,你有'var initialise = function(){console.log(“initialising”); I = 0; }'。这是否意味着'initialise()'具有'console.log(“initialising”)的值; I = 0;'? – PeanutsMonkey

+0

@PananutsMonkey我不确定你的问题,但我会尝试回答。 javascript中的函数是变量,因此可以像其他事物一样存储并在以后调用。因此,这个'function initialise(){some code}'和'var initialise = function(){some code}'是一样的。由于这对于JavaScript的某些后续概念非常重要,您可能会也可能不会跨越,所以我认为编写上述函数是一种很好的做法。 – Ross

6

想想环路以下

for(initializers; condition; postexec) { 
    execution 
} 
  1. 当循环第一次启动代码var i = 0运行。这会初始化您要在循环内测试的变量

  2. 接下来,该循环将评估i < 10表达式。这会返回一个布尔值,在运行的前10次将为true。当这个表达式保持评估为true时,循环内的代码就会运行。

    document.write("This is number " + i);

  3. 此代码后,每次运行的循环执行i++的最后一部分。此示例中的代码在每次执行后将1添加到i

执行代码后,循环的条件是检查并重复步骤2和3,直到最后条件为假,在这种情况下退出循环。

这种方式循环使用您提到的语言。

+1

你是对的,但为什么OP应该比你引用的网站更信任你?我不想贬低你的答案,但你只是重复OP已经相信的知识。 –

+1

我觉得我正在用不同的方式解释他所知道的。他对我的解释的解释应该与他已经相信的相一致。 – secretformula

+1

@FelixKling可能是因为SO拥有投票系统,因此SO有一种同行评议的形式,答案已被投票。也许OP不应该比所引用的网站更信任SO。但这就是为什么OP会首先提出这个问题的问题。 :) – Ross

2

第二个参考是错误的。你的解释是正确的。

1

另一种方式来想想,如果这能帮助你:

var i = 0; 
while (i < 10) { 
    document.write("This is number " + i); 
    i++; 
} 
+0

好的。作为初学者,我认为当你大声读出它时,最初它比for循环更有意义,主要是因为一切都是按顺序的。 –

+0

我没有碰到while循环,但是它确实向我介绍了另一种方法来处理它 – PeanutsMonkey

0

这是for语句的语法:

for(initalize, condition, increment) { 
    Do_some_things(); 
} 

initalize将只执行一个时候for开始则执行Do_some_things();声明,而condition仍然true它将执行increment,然后Do_some_things();。如果co condition为false,则为退出。

for (var i=0; i < 10; i=i+1) { 
    document.write("This is number " + i); 
} 

var i=0将执行一次(initalize)。 i < 10条件总是在循环后检查。 i=i+1将在检查i < 10后执行,结果为真。 值I的是:0,1,3,4,5,6,7,8,9(10次循环)

+1

在执行块之前,测试**条件(第二个表达式)**。如果条件最初为false,则块将不会执行。 “增量”(第三个表达式)始终在块完成之后并再次测试条件之前执行。请注意,“条件”和“增量”可以是任何有效的表达式,但第二个必须对要执行的块评估为true。 – RobG

4

让我们来看看corresponding section in the ECMAScript specification

生产
IterationStatementfor (varVariableDeclarationListNoIn;表达选择;表达选择)声明
如下评价:

1. Evaluate VariableDeclarationListNoIn. 
2. Let V = empty. 
3. Repeat 
    a. If the first Expression is present, then 
    i. Let testExprRef be the result of evaluating the first Expression. 
    ii. If ToBoolean(GetValue(testExprRef)) is false, 
     return (normal, V, empty). 
    b. Let stmt be the result of evaluating Statement. 
    ... 
    f. If the second Expression is present, then 
    i. Let incExprRef be the result of evaluating the second Expression. 
    ii. Call GetValue(incExprRef). (This value is not used.) 

正如可以看到,在步骤1中,可变分配被评价。在步骤3a中,测试条件。在步骤3b中,评估循环体,并且在之后第三表达式在步骤3f中被评估。

因此您对for循环的理解是正确的。


这是假设它在其他语言中以同样的方式,因为for外环为编程语言,一个共同声明(请注意,Python没有这样的说法)。但如果你想绝对确定,你最好参考他们的规范。

+1

+1包括适当的参考。 – RobG

+0

@Felix Kling - 我不介意提及说明书,但通常不是这些解释超出了像​​我这样的新手所能掌握的范围。除非像你这样的人会解释它,否则我不会理解你引用的参考。 – PeanutsMonkey

+0

@PananutsMonkey:是的,我可以理解。但是,如果你不时看看它,你只能开始理解它。它会更好的。我花了很长时间去理解它,并且有些部分仍然很困难。 –