为多个 for 循环重新定义变量,好的还是坏的做法?

Redefining variables for multiple for loops, good or bad practice?

我在工作中主要使用 AS3 编程,其中最低范围是函数而不是执行块。这意味着以下代码可以正常工作

for (var i:int = 0; i < 3; i++) {trace(i);}

但是此代码会导致警告,因为显然 i 正在被重新定义。

for (var i:int = 0; i < 3; i++) {trace(i);}
for (var i:int = 0; i < 3; i++) {trace(i);}

这意味着我通常必须做这样的事情来避免来自编译器的警告(以及来自我的上级关于 "bad practice" 的谴责)。

var i:int;
for (i = 0; i < 3; i++) {trace(i);}
for (i = 0; i < 3; i++) {trace(i);}

我最近一直在尝试使用 TypeScript,我发现 let 用于定义执行块作用域的概念非常实用。我和一位同事讨论过这个问题,他坚持认为在循环中使用 let 是不好的做法,因为变量在每个循环中都会重新定义。

TypeScript 中的以下两种方法在性能方面是否存在根本差异?

for (let i:number = 0; i < 3; i++) {console.log(i)}
for (let i:number = 0; i < 3; i++) {console.log(i)}

let i:number
for (i = 0; i < 3; i++) {console.log(i)}
for (i = 0; i < 3; i++) {console.log(i)}

当您使用 let 定义变量时,该变量在范围内是局部的。

所以当你这样做时

for (let i:number = 0; i < 3; i++) {console.log(i)}

i 被限定在循环 for.

在每个循环中声明 i 并不是一个坏习惯。

例如,如果你在两个不同的数组上循环,你可以创建两个循环来迭代它。

如果你为每个使用一个特定的 iteraztor 名称,你可以有这样的代码:

 const arrFoo: Array<number> = [0, 1, 2];
 const arrBar: Array<number> = [0, 1, 2];
 for (let iteratorFoo:number = 0; iteratorFoo < arrFoo.length; i++) {console.log(iteratorFoo);}
 for (let iteratorBar:number = 0; iteratorBar < arrBar.length; i++) {console.log(iteratorBar);}

在这种情况下,最好声明两个不同的迭代器。


除非你在每个循环中使用相同的i

赞:

let i:number
for (i = 0; i < 3; i++) {console.log(i)} // show 0, 1, 2
for (; i < 6; i++) {console.log(i)} // show 3, 4, 5

而且就性能而言,人类显然无法察觉差异。


根据评论编辑:

What about in a case where the loop iterates tens of thousands of times?

for ([initialization]; [condition]; [final-expression])

initialization An expression (including assignment expressions) or variable declaration evaluated once before the loop begins. Typically used to initialize a counter variable. This expression may optionally declare new variables with var or let keywords. [...]. Variables declared with let are local to the statement.

Reference

所以初始化只计算一次,即使你的循环迭代数万次。