繁体   English   中英

为什么 For 表达式中的方法在每个循环中进行评估

[英]Why Do Methods In A For Expression Evaluate Per Loop

给定代码

var loops = 5;
var counter = 0;

function foo(counts){
    var baz = 0;
    for(var i=0;i<loops;i++){
        baz += i + counts;
    }
    return baz;
}

for(var i=0;i<foo(counter);i++){ //issue in this line
    console.log(i);
}

每次 for 循环递增时,它都会再次调用 foo function。

为什么要这样做,有没有办法防止这种情况发生?

我知道我可以将返回值存储在一个变量中,但我仍然很好奇为什么会发生这种情况。

在 python 等其他语言中不会发生这种情况。

我测试它的方法是在 foo function 中设置断点。

停止条件是评估每次迭代。 如果您只想评估一次,请执行以下操作:

 var loops = 5; var counter = 0; function foo(counts){ var baz = 0; for(var i=0;i<loops;i++){ baz += i + counts; } return baz; } for(var i=0,l=foo(counter);i<l;i++){ //issue in this line console.log(i); }

等效的 python 代码将是

i = 0
while i < foo(counter):
    print(i)
    i++

这正是for循环所做的,在每次迭代之前评估条件。 如果只想调用foo一次,则必须将结果显式缓存在变量中:

for (var i=0, n=foo(counter); i<n; i++) {
    console.log(i);
}

(更 Pythonic)的替代方法是使用range生成器(虽然在 JS 标准库中不可用),其中foo仅调用一次以创建迭代器:

for (var i of range(0, foo(counter)) {
    console.log(i);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM