2011-01-12 22 views
7

考慮下面的CoffeeScript代碼:爲什麼coffeescript會生成這樣的類?

class Animal 
    constructor: (@name) -> 
    speak: (things) -> "My name is #{@name} and I like #{things}" 

這是產生:

var Animal = (function() { 
    function Animal(name) { 
    this.name = name; 
    } 
    Animal.prototype.speak = function(things) { 
    return "My name is " + this.name + " and I like " + things; 
    }; 
    return Animal; 
})(); 

但是,爲什麼沒有產生這種更地道的代碼?

var Animal = function Animal(name) { 
    this.name = name; 
}; 
Animal.prototype.speak = function(things) { 
    return "My name is " + this.name + " and I like " + things; 
}; 

我知道coffeescript在匿名函數中封裝了很多東西來控制範圍泄漏,但是這裏可能會泄漏什麼?

+3

一個主觀的和議論性的近距離投票?真?這是一個有效的問題,詢問爲什麼有必要將函數包裝在匿名函數中。 – ryeguy 2011-01-12 16:19:57

回答

12

生成的代碼可以在Internet Explorer中可靠地命名函數。 (在這種情況下,「動物」)。如果您只是在頂級作用域使用命名函數,它將與可能存在的任何var Animal =聲明發生衝突......即使在較小的作用域中,也會阻止它們被正確引用。爲了解決IE錯誤,我們在類定義中包含了函數包裝器。

2

這是爲了支持包括類名的回溯,而不是在引發異常時的函數名稱。

+0

你能詳細說一下嗎?我不確定我是否理解這是如何工作的。 – casablanca 2011-01-12 16:39:53

+0

@casablanca - 參見:http://www.javascriptkata。com/2010/05/19/how-to-de-anonymize-your-anonymous-functions /在堆棧跟蹤中查看`aonon(),aonon()`和`func1(),func2()` 。 – 2011-01-12 16:49:06

+0

@Sean:這解釋了爲什麼這個函數被命名爲`Animal`,但似乎沒有解釋爲什麼它被封裝在一個匿名函數中。 – ryeguy 2011-01-12 16:58:39

2

CoffeeScript方法也具有縮小的優點。

my other answer

對於最合理的類,由CoffeeScript的所產生的閉合產生較小的縮小的輸出。 封閉包裝是25個字節縮小的開銷,但它節省你重複類名,節省k * N字節(K =字母合名,N =參NUM-的-)。例如,如果像BoilerPlateThingyFactory這樣的類具有2+方法,則封閉包裝生成較小的縮小代碼。



詳細...

的咖啡生成的代碼使用封閉minifies到:

// Uglify '1.js' = 138 bytes (197 w/ whitespace): 

var Animal=function(){function e(e){this.name=e}return e.prototype.speak=function(e){return"My name is "+this.name+" and I like "+e},e}(); 

// with whitespace ("uglifyjs -b"): 

var Animal = function() { 
    function e(e) { 
     this.name = e; 
    } 
    return e.prototype.speak = function(e) { 
     return "My name is " + this.name + " and I like " + e; 
    }, e; 
}(); 

ryeguy的另類 「習慣」 實施minifies這個:

// Uglify '2.js' = 119 bytes (150 w/ whitespace): 

var Animal=function(t){this.name=t};Animal.prototype.speak=function(e){return"My name is "+this.name+" and I like "+e}; 

// with whitespace ("uglifyjs -b"): 

var Animal = function(t) { 
    this.name = t; 
}; 

Animal.prototype.speak = function(e) { 
    return "My name is " + this.name + " and I like " + e; 
}; 

請注意咖啡形式中名稱「Animal」的名稱是否存在一次,以及ryeguy的「慣用」變量中N = 2次。現在「動物」只有6個字母,只有1個方法,所以咖啡在這裏應該減少25-6 = 19個字節。諮詢我的縮小代碼,它是138字節到119字節,增量爲... 19字節。再添加4種方法,優勢將轉爲咖啡。這不僅僅是方法;類常量和其他參考類型也會計數。

相關問題