2011-01-12 12 views
7

निम्नलिखित कॉफ़ीस्क्रिप्ट कोड को देखते हुए:कॉफ़ीस्क्रिप्ट इस तरह की कक्षाएं क्यों उत्पन्न करता है?

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; 
}; 

मुझे पता है कि कॉफ़ीस्क्रिप्ट स्कोप रिसाव को नियंत्रित करने के लिए अज्ञात कार्यों में बहुत सी चीजें लपेटती है, लेकिन यहां क्या लीक हो सकती है?

+3

एक व्यक्तिपरक और तर्कवादी करीबी वोट? वास्तव में? यह एक वैध सवाल है कि एक अज्ञात फ़ंक्शन में फ़ंक्शन को लपेटना क्यों जरूरी है। – ryeguy

उत्तर

12

जेनरेट कोड संभवतः इंटरनेट एक्सप्लोरर में फ़ंक्शंस नामित करना संभव बनाता है। (इस मामले में, "पशु"।) यदि आप बस शीर्ष-स्तरीय दायरे पर नामित फ़ंक्शन का उपयोग करते हैं, तो यह किसी भी var Animal = घोषणाओं के साथ संघर्ष करेगा जो मौजूद हो सकता है ... यहां तक ​​कि निचले क्षेत्रों में भी, उन्हें सही ढंग से संदर्भित करने से रोकना। आईई बग के आसपास काम करने के लिए, हम वर्ग परिभाषा के चारों ओर फ़ंक्शन रैपर शामिल करते हैं।

+5

"नाम उलझन" बिल्कुल चिंता नहीं है (आप वैसे भी 'var Animal =' कर रहे हैं)। मुद्दा यह है कि आपको कभी भी JScript के लिए function _expressions_ नाम नहीं देना चाहिए था। "आईई बग" के बारे में अधिक जानकारी: http://kangax.github.com/nfe/ – matyr

2

यह वर्ग नामों सहित बैकट्रैस का समर्थन करना है, न कि अपवाद फेंकने पर फ़ंक्शन नामों का समर्थन करना।

+0

क्या आप विस्तृत कर सकते हैं? मुझे यकीन नहीं है कि मैं समझता हूं कि यह कैसे काम करता है। – casablanca

+0

@ कैसाब्लांका - देखें: http: //www.javascriptkata।com/2010/05/19/how-to-de-anonymize-your-anonymous-functions/स्टैक ट्रेस में 'aonon(), aonon() 'और' func1(), func2()' को देखने के बीच यह अंतर है । –

+0

@ सेन: यह बताता है कि फ़ंक्शन को 'Animal' क्यों नाम दिया गया है, लेकिन ऐसा लगता है कि यह किसी अज्ञात फ़ंक्शन में क्यों लपेटा गया है। – ryeguy

2

कॉफीस्क्रिप्ट विधि में भी कमी के फायदे हैं।

my other answer से:

सबसे उचित वर्गों के लिए, CoffeeScript द्वारा उत्पन्न बंद छोटे minified उत्पादन उत्पन्न करता है। बंद आवरण minified भूमि के ऊपर के 25 बाइट्स है, लेकिन यह classname दोहरा से बचाता है, k * N बाइट्स बचत (k = पत्र में नाम, एन = संख्या के- refs)। उदा।, यदि BoilerPlateThingyFactory जैसी कक्षा में 2+ विधियां हैं, तो क्लोजर रैपर छोटे minified कोड उत्पन्न करता है।

// 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:



और अधिक विस्तार में ...

कॉफी के लिए एक बंद 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; 
}; 

ध्यान दें कि कैसे कॉफी नाम में "पशु" नाम ठीक है, और राईगुय के "मूर्खतापूर्ण" भिन्नता में एन = 2 बार। अब "पशु" केवल 6-अक्षर है, और केवल 1 विधि है, इसलिए यहां कॉफी 25-6 = 1 बाइट्स से हारनी चाहिए। मेरे मिनीफाइड कोड से परामर्श, यह 138 बाइट्स है जो डेल्टा के लिए 13 बाइट्स है ... 1 9 बाइट्स। 4 और तरीके जोड़ें, और लाभ कॉफी पर स्विच होगा। और यह सिर्फ विधियों नहीं है; कक्षा स्थिरांक और अन्य रेफरी प्रकार भी गिनती हैं।

+0

आपके यूग्लीफाइड कोड में अल्पविराम से अलग 'वापसी' अभिव्यक्ति दिलचस्प है। मेरे कंसोल में, 'x, y, z;' वापस लौटें, तीनों अभिव्यक्तियों का मूल्यांकन करना प्रतीत होता है, लेकिन केवल अंतिम को वापस कर देता है। कोड को और अधिक "बदसूरत" बनाने के अलावा, इस तरह से ऐसा करने से कोई प्रभाव पड़ता है? –

+0

@ जस्टिन मॉर्गन - आप सर ने "अल्पविराम ऑपरेटर" की खोज की है! यह अर्द्ध-कोलन की तरह है, लेकिन अधिक शक्तिशाली है क्योंकि इसे अभिव्यक्ति के रूप में उपयोग किया जा सकता है। तो "ए, बी, सी;" "ए" का मूल्यांकन करेगा, फिर "बी", फिर "सी", और समग्र अभिव्यक्ति का मूल्य "सी" होगा। यह एक ऑपरेटर है कि जेएस सी, fwiw से विरासत में है। http://en.wikipedia.org/wiki/Comma_operator –

संबंधित मुद्दे