为什么CoffeeScript没有“使用”循环变量?

时间:2012-08-14 11:10:44

标签: javascript loops coffeescript

我是CoffeeScript的新手,对此非常兴奋。我做了一些基本的循环here。现在,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会为每个循环使用不同的变量?

2 个答案:

答案 0 :(得分:2)

没有查看CoffeeScript源代码,这是我(受过教育的)猜测:

CoffeeScript解释器只为您编写的每个for创建一个新的for .. in循环结构。在构造输出JS时,它维护一个局部变量名称表,并在必要时附加到该表。

毕竟,您可以嵌套这些for .. in循环,在这种情况下,您仍然需要在JS中使用单独的循环变量。

有必要跟踪可能重复使用本地函数范围中的哪些变量。这是可能的,但比它的价值更复杂 - 它根本没有提供任何好处,所以CoffeeScript不会这样做。

答案 1 :(得分:1)

另一方面,CS不能指望你只使用循环内部的变量。虽然依靠迭代变量在循环外使用可能很危险,但您可能希望这样做。如果它总是使用相同的变量,那么CS重用它就不会给你机会。