-
あなたはスコープをお勧めします。たとえば、コールバック関数を作成したり、javascriptオブジェクトへの参照を持たせたい場合があります。詳細については、javascriptがスコープでブロックされない理由を参照してください。
[編集:現代のjavascriptはlet
の変数をサポートするようになりました。あなたがvar
変数を宣言したESv6の前に戻ると、関数codeblockの先頭に書かれているかのように巻いたので、頻繁にfor-loopsの本体を関数として書く必要がありました。しかし、これはまだ当てはまります:]関数が書かれていれば、それが重要なボトルネックでない限り関数型を使うこともできます。
- あなたのコードは必ずしもコンピュータのフルスピードで実行する必要はありません。ボトルネックでコードを最適化することさえできないかもしれません。
- さらに、「JSPerfでのテスト」を提供していないので、それを批評することができます。例えば、あなたがすでにリダクション関数(またはmapまたはforEach関数)を持っているなら、パフォーマンスはon-parとなるでしょう。多くのブラウザが異なるように最適化したり、異なる関数呼び出しのオーバーヘッドを持つ場合には、テスト方法に欠陥があるかもしれません。
追記:これは構文の間で有効な性能比較ですが、中に無効な性能比較構文が手元に疑問はない場合:
:
myArray.map(function(x){return x+1})
// ...versus...
for(var i=0; i<myArray.length; i++) {
myArray[i] = myArray[i]+1;
}
これは、有効な性能比較になります
myArray.forEach(function(x){return x+1})
// ...versus...
var plusOne = function(x){return x+1};
for(var i=0; i<myArray.length; i++) {
plusOne(myArray[i]);
}
// (may need a side-effect if the compiler is smart enough to optimize this)
(また、あなたの編集への返信で:.forEach()
と.map()
はるかに明快さを提供し、必要性を回避明示的なループint i=0; i<array.length; i++
引数の場合)
私は、有効なパフォーマンス比較を構成するものについてあなたに同意しません。 _first_は有効な比較です。なぜなら、「どのメソッドが最も速いのですが、関数呼び出しを使用しないメソッドは不適格です」という質問ではなく、「どのメソッドが配列の各要素に1つを追加するのが最も速いのですか?エントリから "。とにかくスコープ/クロージャの目的のために関数を望むと仮定した場合は、 '.reduce()'や '.forEach()'などを使用することもできます。 – nnnnnn
質問は構文に関するものなので、有効なパフォーマンス比較です。おそらく、すべての可能なパフォーマンスを絞るシナリオで質問を言い換えるべきでしょう。その場合、私はプレーン・フォー・ループを使用しないような良い理由を見つけることができません。スコープが絶対に必要な具体的な例を教えてください。 –
@EvanYou: '[1,2,3]。for(var i = 0; i <4; i ++){setTimeout(forAlert 1,2,3)}に対して、forEach(function(x){alert(x)}、 function(){alert(i)}、1000)} '(アラート4,4,4) – ninjagecko