2012-08-14 64 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

相關問題