3

私は CoffeeScript を初めて使用し、とても楽しみにしています。ここでいくつかの基本的なループを作成しました。現在、CoffeeScript は次のように、すべてのループに対してループ変数を定義しています。

var food, _i, _j, _len, _len1;

for (_i = 0, _len = fruits.length; _i < _len; _i++) {
  food = fruits[_i];
  console.log(food);
}

for (_j = 0, _len1 = vegetables.length; _j < _len1; _j++) {
  food = vegetables[_j];
  console.log(food);
}

私はループを次のようにコーディングしていました。

for(var i = 0; i < fruits.length; i++) {
    console.log(fruits[i]);
}

for(var i = 0; i < vegetables.length; i++) {
    console.log(vegetables[i]);
}

iすべてのループのループ変数でした(ネストされたループは除外されました)。ここで、変数を定義する前に常に変数を宣言する必要があることを学びました。そこで、コーディングの習慣を次のように変更しました。

var i;
for(i = 0; i < fruits.length; i++) {
    console.log(fruits[i]);
}

for(i = 0; i < vegetables.length; i++) {
    console.log(vegetables[i]);
}

私が同じスコープにいる限り、何も問題はありませんでしたが、コンパイルされた CoffeeScript コードには疑問が残りました。

CoffeeScript がループごとに異なる変数を使用するのはなぜですか?

4

2 に答える 2

2

CoffeeScript のソース コードを確認していないので、私の (知識に基づく) 推測は次のとおりです。

CoffeeScript インタープリターは、記述forごとに新しいループ構造を作成するだけfor .. inです。出力 JS を構築している間、ローカル変数名のテーブルを維持し、必要に応じてそれに追加します。

結局のところ、これらのfor .. inループを入れ子にすることもできますが、その場合、とにかく JS で個別のループ変数が必要になります。

ローカル関数スコープ内のどの変数が再利用される可能性があるかを追跡する必要があります。これは可能ですが、その価値よりも複雑です。単純にメリットがないため、CoffeeScript はそれを行いません。

于 2012-08-14T11:27:25.557 に答える
1

これの反対側は、CS は、ループ内で変数を使用するだけでは当てにならないということです。ループ外で使用するために反復変数に依存するのは危険かもしれませんが、そうすることが必要になる可能性があります。CS がそれを再利用しても、常に同じ変数を使用している場合、その可能性はありません。

于 2012-08-14T11:52:42.187 に答える