在多个for循环中使用相同的变量名是不好的做法吗?
Is it bad practice to use the same variable name in multiple for-loops?
我只是在使用JSHint检查一些JavaScript代码。在代码中,我有两个for循环,它们都是这样使用的:
for (var i = 0; i < somevalue; i++) { ... }
因此两个for循环都使用变量i进行迭代。
现在JSHint显示了第二个for循环的错误:'i'已经定义了';我不能说这不是真的(因为它显然是),但我一直认为这无关紧要,因为变量I只在那个特定的地方使用。
这样使用for循环是不好的做法吗?我是否应该为代码中的每个for循环使用不同的变量,比如
//for-loop 1
for (var i = 0; ...; i++) { ... }
//for-loop 2
for (var j = 0; ...; j++) { ... }
或者这是我可以忽略的错误之一(因为它不会破坏我的代码,它仍然做它应该做的事情)?
JSLint顺便说一句。在第一个for循环时停止验证,因为我没有在函数的顶部定义var I(这就是我首先切换到JSHint的原因)。所以根据这个问题中的例子:我应该使用JSLint还是JSHint JavaScript验证?-我应该使用这样的for循环来确认JSLint:
...
var i;
...
//for-loop 1
for (i = 0; ...; i++) { ... }
...
//for-loop 2
for (i = 0; ...; i++) { ... }
这对我来说也很好,因为这样我就可以避免JSLint和JSHint中的错误。但我不确定的是,我是否应该为每个for循环使用不同的变量,像这样:
...
var i, j;
...
//for-loop 1
for (i = 0; ...; i++) { ... }
//for-loop 2
for (j = 0; ...; j++) { ... }
那么是否有最佳实践呢?或者我可以直接使用上面的任何代码,也就是说我选择"my"最佳实践?
由于变量声明被提升到它们出现的作用域的顶部,解释器将以相同的方式有效地解释两个版本。因此,JSHint和JSLint建议将声明从循环初始化器中移出。
以下代码…
for (var i = 0; i < 10; i++) {}
for (var i = 5; i < 15; i++) {}
…有效地解释为:
var i;
for (i = 0; i < 10; i++) {}
for (i = 5; i < 15; i++) {}
注意,i
实际上只有一个声明,并且对它有多个赋值——你不能真的"redeclare";在同一作用域中的变量
要真正回答你的问题…
是否有最佳实践,或者我可以使用上面的任何代码?
关于如何最好地处理这个问题有不同的意见。就我个人而言,我同意JSLint,并且认为在每个作用域的顶部声明所有变量会使代码更清晰。既然这就是代码将被解释的方式,为什么不编写看起来像它行为的代码呢?
但是,正如您所观察到的,无论采用哪种方法,代码都可以正常工作,因此这是一种风格/惯例选择,您可以使用您觉得最舒服的任何形式。
@TSCrowder在评论中提到:如果你的环境支持它(Firefox, Node.js),在ES6中你可以使用let
声明
//for-loop 1
for (let i = 0; ...; i++) { ... }
//for-loop 2
for (let i = 0; ...; i++) { ... }
其中将范围限制在for循环内。奖励:JSHint停止抱怨
javascript中的变量是函数作用域(不是块作用域)。
当你在一个循环中定义var i
时,它会一直存在于循环中,也存在于具有该循环的函数中。
见下文,
function myfun() {
//for-loop 1
for (var i = 0; ...; i++) { ... }
// i is already defined, its scope is visible outside of the loop1.
// so you should do something like this in second loop.
for (i = 0; ...; j++) { ... }
// But doing such will be inappropriate, as you will need to remember
// if `i` has been defined already or not. If not, the `i` would be global variable.
}
JSHint显示错误的原因是因为在JS中变量作用域是函数,变量声明被提升到函数的顶部。
在Firefox中,您可以使用let
关键字来定义块范围,但目前不支持其他浏览器。
let
关键字包含在ECMAScript 6规范中
我知道这个问题已经有了答案,但是如果你想要超级的for循环,可以这样写:
var names = ['alex','john','paul','nemo'],
name = '',
idx = 0,
len = names.length;
for(;idx<len;++idx)
{
name = names[idx];
// do processing...
}
这里有几件事…
数组长度被存储在
len
中。这将阻止JS在每次迭代中评估names.length
idx
增量是一个预增量(例如++idx不是idx++)。存储对
name
的引用。这是可选的,但如果您将大量使用name
变量,则建议这样做。每次调用names[idx]
都需要在数组中找到索引。无论这个搜索是线性搜索,树搜索还是哈希表,查找仍然在进行。因此,将引用存储在另一个变量中以减少查找。
最后,这只是我的个人偏好,我没有证据或任何性能好处。然而,我总是喜欢将变量初始化为它们将要成为的类型,例如name = '',
.
最佳实践是减少变量的作用域,因此为循环声明迭代变量的最佳方法是
//for-loop 1
for (var i = 0; ...; i++) { ... }
//for-loop 2
for (var j = 0; ...; j++) { ... }
我知道用var
声明的变量的范围,但我在这里讨论代码的可读性。
- AngularJS-在JSON选择器中使用变量名
- 命令行中的Uglify js;不要弄乱变量名
- 像createComment这样的各种自定义变量名在内联javascript中被覆盖,但在外部js中没有.为什么?
- 这在JavaScript中是一个好的变量名吗
- 在javascript中,在变量名之前使用var有什么区别/优势吗
- 在Javascript中连接一个动态变量名
- 如何使用jQuery循环变量名
- JavaScript将字符串转换为变量名
- 根据发送到javascript中函数的参数创建变量名
- 检索本身包含变量的 Jquery 变量名的值
- 测试JavaScript是否符合异常变量名
- 动态变量名语法
- 动态jQuery变量名
- jquery没有't从DIV数据id中获取PHP变量值,只输出变量名
- jQuery在for循环中动态递增变量名
- for循环中的动态变量名
- 可以是由for循环中的数组值确定的变量名
- 在多个for循环中使用相同的变量名是不好的做法吗?
- 如何设置变量名"i"javascript中的In for循环
- JS-使用for将数组添加到具有变量名操作的数组中