我在Javascript中有一个关于while循环的简单问题。 当我在浏览器控制台中运行这个简单的循环:
var count = 0;
while (count < 10) {
console.log(count);
count++;
}
&#13;
控制台日志的输出为0,1,2 ... 9。 (正如预期的那样)。 但是还有一个号码返回到控制台:
<- 9
此返回值来自何处?
我认为这是count++ expression
的返回值。但为什么每个循环都没有返回值?
是否有可能以某种方式将返回的值捕获到变量?
答案 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:
- 让 blockValue 成为评估 StatementList 的结果。
- 将正在运行的执行上下文的LexicalEnvironment设置为oldEnv。
- 返回 blockValue 。
醇>
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控制台中,您可以使用$_
。