Javascript while循环返回值

时间:2016-02-17 10:39:14

标签: javascript loops syntax while-loop

我在Javascript中有一个关于while循环的简单问题。 当我在浏览器控制台中运行这个简单的循环:



var count = 0;
while (count < 10) {
    console.log(count);
    count++;
}
&#13;
&#13;
&#13;

控制台日志的输出为0,1,2 ... 9。 (正如预期的那样)。 但是还有一个号码返回到控制台:

<- 9

此返回值来自何处?

我认为这是count++ expression的返回值。但为什么每个循环都没有返回值?

是否有可能以某种方式将返回的值捕获到变量?

3 个答案:

答案 0 :(得分:7)

read-eval-print-loops(REPLs)如浏览器控制台显示代码生成的最后结果。有点令人惊讶的是,JavaScript while循环和块有结果。对于块,它是块中最后一个语句的结果。对于while语句,它是附加到while的语句的最后一次迭代的结果(在您的情况下是一个块)。

这里只是一个简单的例子:

{1 + 1; 3 + 3;}

在像浏览器控制台这样的REPL中,上面会显示6,因为它是一个包含两个ExpressionStatements的块。第一个ExpressionStatement的结果是2(结果被抛弃),第二个结果是6,所以块的结果是6.这是covered in the specification

  
      
  1. blockValue 成为评估 StatementList 的结果。
  2.   
  3. 将正在运行的执行上下文的LexicalEnvironment设置为oldEnv。
  4.   
  5. 返回 blockValue
  6.   

while循环结果为covered here

  

是否有可能以某种方式将返回的值捕获到变量?

不,代码中无法访问这些结果。例如,你不能var x = while (count < 10 { count++; });或类似。您必须捕获循环/块/等中的结果,将其分配给变量或类似变量。或者(并且我建议这样做),请使用eval as Alin points out

答案 1 :(得分:2)

当您直接在浏览器控制台中运行代码时,它会运行代码,然后记录最后执行的表达式的值,在本例中为count++的值,最终执行时为9 (它使用后增量运算符更改为10,即在值9为“已读”之后。

如果您将代码更改为:

var count = 0;
while (count < 10) {
  console.log(count);
  ++count;
}

它会改为记录<- 10

  

但为什么每个循环都没有返回值?

因为它根本没有被返回,所以它只是控制台的行为。

  

是否有可能以某种方式将返回的值捕获到变量?

是的,但你需要分配它:

var count = 0;
var lastcount;
while (count < 10) {
  console.log(count);
  lastcount = count++;
}

console.log(lastcount);

请注意,如果您在控制台中运行此代码段,则会记录两个9个记录(一个来自最后一个循环,一个来自额外的console.log),然后是<- undefined ,因为上一个console.log返回undefined

答案 2 :(得分:1)

我认为答案可以在behavior of eval

中找到
  

eval()返回最后一个表达式的值。

你在控制台中扔的东西最有可能通过eval()(或类似的东西)。并返回最后一个评估的表达式,在您的情况下count++,然后记录到控制台。 (由于后增量,值 9 ,而不是 10 。)

我认为您不能存储评估结果,除非您明确地将其通过另一个eval()

var x = eval("var count = 0;while (count < 10) {console.log(count);count++;};");

或者,在Google Chrome控制台中,您可以使用$_