2012-08-14 33 views
3

我是CoffeeScript的新手,对此非常兴奋。我做了一些基本的循环here。现在,CoffeeScript中被定义为循环循环变量有如下:为什么CoffeScript不能“重复使用”循环变量?

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

不必看了看CoffeeScript的源代码,这是我的(学历)的猜测:

的CoffeeScript的解释简单地创建一个新的for循环结构,每for .. in你写。在构建输出JS时,它会维护一个局部变量名称表并根据需要添加到该表中。毕竟,你可以嵌套这些for .. in循环,在这种情况下,你会开始在JS中开始需要单独的循环变量。

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

+0

如果你手动执行它可能会很棘手,但是由于CoffeeScript以编程方式编译JS,我认为有一种方法可以跟踪某个变量是否可以“重复使用”。在源代码中使用较少的变量声明是一种好处,是不是? – Amberlamps 2012-08-14 11:35:48

+0

@Amberlamps不,这不足以解决问题。 JavaScript中的变量并不是很贵。实施一种逻辑来跟踪哪些重用*的成本比较高。仅仅因为'_i'已经存在而阻止'_j'声明的增益小于可以忽略的程度。 – Tomalak 2012-08-14 11:37:47

+0

我明白了,但是逻辑只能在开发模式下保持跟踪。一旦进入生产模式,编译后的JS就会被客户使用。 – Amberlamps 2012-08-14 12:41:45

1

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

+0

该变量在CS源中不存在。 – Deestan 2012-08-14 12:14:45

+0

我不是CS用户,所以我会对此表示赞同。但是没有办法访问迭代变量?对于更复杂的循环函数,似乎有一种方法可以访问这个变量。但是,再次,不是一个CSer,所以如果这是严格的执行,我想这可能是一件好事。 – Stephen 2012-08-14 12:25:09

+0

他发布了一个链接:http://coffeescript.org/#try%3aconsole.log%20food%20for%20food%20in%20fruits%0A%0Aconsole.log%20food%20for%20food%20in%20vegetables – Deestan 2012-08-14 12:26:17

相关问题