2009-10-27 18 views
6

, उदाहरण के लिए jQuery ढांचे ले रहा है, तो आप इस तरह कोड चलाएँ:जावास्क्रिप्ट में अंतर्निहित कार्यों का नाम दिया गया है?

$(document).ready(function init() { foo.bar(); }); 

स्टैक ट्रेस आप Firebug में मिलता है इस तरह दिखेगा:

init() 
anonymous() 
anonymous([function(), init(), function(), 4 more...], function(), Object name=args) 
anonymous() 
anonymous() 

आप देख सकते हैं, यह बहुत नहीं है पठनीय, क्योंकि यह जानने के लिए कि आपको यह पता लगाने के लिए प्रत्येक फ़ंक्शन पर क्लिक करना होगा। गुमनाम कार्य प्रोफाइलर में (?)() के रूप में भी दिखाई देंगे, और वे "cannot access optimized closure" बग का कारण बन सकते हैं। ऐसा लगता है कि इनसे बचने के लिए ये अच्छे कारण हैं। फिर यह तथ्य है कि ECMAScript 5 arguments.callee को अपने सख्त मोड में बहिष्कृत कर देगा, जिसका अर्थ है कि इसके साथ अज्ञात कार्यों को संदर्भित करना संभव नहीं होगा, जिससे उन्हें भविष्य में थोड़ा सा सबूत मिल सके।

दूसरी ओर, नामित कार्यों का उपयोग कर पुनरावृत्ति हो सकती है, जैसे:

var Foo = { 
    bar: function bar() {} 
} 

function Foo() {} 

Foo.prototype.bar = function bar() {} 

हूँ मैं यह सोच कर कि इस पुनरावृत्ति डिबगिंग सुविधा नामित कार्यों प्रदान की रोशनी में उचित है, में सही करें और कि प्रसार jQuery जैसे अच्छे ढांचे में गुमनाम कार्यों का एक निरीक्षण है?

उत्तर

3

मुझे इस प्रश्न का उत्तर very informative article में मिला। सबसे पहले, यह पता चला है कि मैं नामित कार्यों के बारे में अधिक वांछनीय था, लेकिन समाधान सभी अज्ञात कार्यों में पहचानकर्ता जोड़ने के समान सरल नहीं है। इसके लिए मुख्य कारण जेस्क्रिप्ट एक बहुत टूटे तरीके से फ़ंक्शन एक्सप्रेशन कार्यान्वित कर रहा है।

दूसरा, फ़ंक्शन कथन और अभिव्यक्तियों के बीच एक अंतर है। एक अज्ञात फ़ंक्शन केवल पहचानकर्ता के साथ एक फ़ंक्शन अभिव्यक्ति है, और एक पहचानकर्ता (इसे नामकरण) जोड़ना इसे एक कथन नहीं देगा (जेस्क्रिप्ट को छोड़कर, यही कारण है कि यह टूटा हुआ है)। इसका मतलब है कि अन्य सभी उत्तरों बंद निशान थे।

+2

दुर्भाग्यवश उस लेख का लिंक अब काम नहीं कर रहा है। हालांकि एक ही लेख यहां पाया जा सकता है: http://kangax.github.com/nfe/ – Jan

1

लेकिन मेरे लिए अनाम कार्य स्रोत कोड में अधिक पठनीय हैं, क्योंकि मुझे यकीन है कि वे केवल वहां उपयोग किए जाते हैं।

3

मैं सहमत हूं कि जावास्क्रिप्ट/ईएमसीएस्क्रिप्ट में अनाम विधियों का उपयोग करने के लिए कुछ डाउनसाइड्स हैं। हालांकि, यह अनदेखा न करें कि उनका उपयोग कैसे किया जाना चाहिए। सरल एक लाइनर के लिए जिसे आप किसी अन्य फ़ंक्शन में पास करना चाहते हैं, वे अक्सर उत्कृष्ट होते हैं।

+1

नामित फ़ंक्शंस का उपयोग करना पसंद नहीं है, जब तक आप वास्तव में लंबे समय तक नामों का उपयोग नहीं कर रहे हैं और शब्द लपेटें। – slikts

+1

इसे नहीं करना है, नहीं, लेकिन कभी-कभी यह बहुत सुविधाजनक है। कभी-कभी फ़ंक्शन को वास्तव में नाम की आवश्यकता नहीं होती है। इसे क्यों दें? –

0

बेनामी फ़ंक्शन बहुत सुविधाजनक हैं। फ़ंक्शंस को नाम देने के बजाय, इस समस्या का बेहतर समाधान, अगर फ़ायरबग आपको बताएगा कि किस पंक्ति में अज्ञात फ़ंक्शन बनाया गया था।

init() 
anonymous() // application.js, line 54 
anonymous() // foo.js, line 2 

और स्टैक ट्रेस एकमात्र ऐसा स्थान है जहां अनाम कार्य एक समस्या है Io।

+0

मैंने अज्ञात कार्यों के साथ तीन अन्य समस्याओं का नाम दिया, और फ़ायरबग उनके लिए लाइन नंबर रिपोर्ट करता है। – slikts

+0

"आईएमओ" का ध्यान रखें। –

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

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