[英]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.