Kat*_*Kat 12 javascript idioms
JavaScript只有函数范围.因此,for循环中声明的变量对于整个函数是可见的.
例如,
function foo() {
for(var i = 0; i < n; i++) {
// Do something
}
// i is still in scope here
}
Run Code Online (Sandbox Code Playgroud)
当我们有多个for循环时,这就打开了我们如何处理这些其他for循环中的变量的问题.
我们使用不同的变量吗?
for(var i = 0; i < n; i++) { }
for(var j = 0; j < n; j++) { }
Run Code Online (Sandbox Code Playgroud)
或者我们使用相同的变量,但只是分配一个值(而不是声明它)?
for(var i = 0; i < n; i++) { }
for(i = 0; i < n; i++) { }
Run Code Online (Sandbox Code Playgroud)
或者i在循环之外声明?
var i;
for(i = 0; i < n; i++) { }
for(i = 0; i < n; i++) { }
Run Code Online (Sandbox Code Playgroud)
还是重新声明i?
for(var i = 0; i < n; i++) { }
for(var i = 0; i < n; i++) { }
Run Code Online (Sandbox Code Playgroud)
所有这些工作(或至少他们在我的浏览器的最新版本上).但是,JSHint并不喜欢最后一种方法.
是否有一种最惯用或更优选的方法?
这实际上取决于您为谁编码。如果您正在为公司编码或为图书馆做出贡献,您当然会遵循他们的风格指南。我已经在图书馆中看到了所有这些(包括最后一个)。如果您喜欢 Douglas Crockford 风格,您可以选择倒数第二个,并将所有变量放在函数作用域的顶部(否则 jslint 会冲您喊叫)。
以jQuery 样式指南为例:
这被认为是很好的风格
var i = 0;
if ( condition ) {
doSomething();
}
while ( !condition ) {
iterating++;
}
for ( ; i < 100; i++ ) {
object[ array[ i ] ] = someFn( i );
}
Run Code Online (Sandbox Code Playgroud)
虽然这是糟糕的风格:
// Bad
if(condition) doSomething();
while(!condition) iterating++;
for(var i=0;i<100;i++) object[array[i]] = someFn(i);
Run Code Online (Sandbox Code Playgroud)
无论如何,因为这是风格,我将参考几个库如何为每个循环编写它们:
如果您的代码在发布之前要最小化,那么这并不重要,因为压缩器会在处理过程中将其破坏为几乎相同的最终表示形式。