2012-08-31 16 views
16

में कार्यों की समानता के लिए परीक्षण कैसे करें I बार और foo की समानता के लिए सकारात्मक परीक्षण कैसे प्राप्त होगा?जावास्क्रिप्ट

foo = function() { 
    a = 1; 
}; 

bar = function() { 
    a = 1; 
}; 

if (foo === bar) alert('baz'); 
if (foo == bar) alert('qux'); 

उपर्युक्त दोनों सशर्त झूठी हैं।

अपडेट किया गया - कारण मैं समारोह समानता

मैं एक प्रकाशित करें/सदस्यता लें ढांचे के निर्माण और कॉलबैक एक विषय से सदस्यता समाप्त करने के लिए inorder उत्तीर्ण करने की आवश्यकता कर रहा हूँ के लिए परीक्षण की आवश्यकता का अनुरोध किया है।

कृपया बेला देखें: http://jsfiddle.net/jamiefearon/hecMS/47/

+0

क्या आप कार्यों के लिए हो सकते हैं एक मूल्य वापस ?? एक वापसी; लापता? – frenchie

+2

यदि आप समझते हैं कि आप ऐसा क्यों करना चाहते हैं, तो यह लोगों को सहायक उत्तर और टिप्पणियां प्रदान करने में सहायता कर सकता है। – Pointy

+0

तो आप यह जांचना चाहते हैं कि दो कार्यों की सामग्री बिल्कुल वही है या नहीं? आपको ऐसा करने की ज़रूरत क्यों है? –

उत्तर

3

आप के लिए दो चर ठीक उसी समारोह वस्तु को उल्लेख करके देखें कि क्या परीक्षण कर सकते हैं, और आप तार करने के लिए कार्यों को बदलने और अगर वे वास्तव में बिल्कुल वैसा ही कर रहे हैं देख सकते हैं, लेकिन यह निर्धारित करने की कोशिश कर रहा है कि दो कार्य ठीक उसी चीज को करते हैं थोड़ा कठिन होगा, या शायद बहुत कठिन होगा।

एक मिनीफायर के माध्यम से कार्यों की एक जोड़ी चलाना दिलचस्प होगा, क्योंकि मिनीफायर स्थिर विश्लेषण की काफी मात्रा में हैं।

+2

थोड़ा कठिन नहीं है, लेकिन वास्तव में असंभव है। – duri

+2

@ डरी अच्छी तरह से मैंने यहां चारों ओर सीखा है कि यह कहकर कहा गया है कि कुछ "असंभव" अपमानित करने का एक अच्छा तरीका है :-) हालांकि, मैं सामान्य रूप से आपसे सहमत हूं, क्योंकि जावास्क्रिप्ट जैसी गतिशील भाषा का पूर्ण स्थैतिक विश्लेषण संभव नहीं। – Pointy

+3

ठीक है, सवाल यह है कि 2 कार्य समकक्ष प्रोग्रामिंग के बजाए गणित से संबंधित हैं लेकिन आपको http://stackoverflow.com/questions/1132051/is-finding-the-equivalence-of-two-functions- अपरिहार्य – duri

0

असल में, यह सामान्य रूप से असंभव है। जावास्क्रिप्ट में कार्यात्मक समानता का परीक्षण करने का कोई तरीका नहीं है। आप जो निकटतम प्राप्त कर सकते हैं वह या तो समानता के लिए स्ट्रिंग के रूप में उनके कोड की तुलना करता है।

+0

यह स्पष्ट रूप से गलत है –

1

ऐसा लगता है कि आपको इस कार्यक्षमता की आवश्यकता है, तो यह आपके प्रोग्राम को थोड़ा सा पुन: व्यवस्थित करना बेहतर हो सकता है। कुछ इस तरह काम कर सकता था:

function baz(myInt) { return 3 + myInt; } 
function asd(a) { return 3 + a; } 

var foo = baz; 
foo(1); //returns 4 

var bar = baz; 
bar(3); //returns 6 

foo === bar; //true 

bar = asd; 
bar(3); //returns 6 

foo === bar; //false 
20

आप की जांच कर सकता है कि क्या दो कार्यों की सामग्री बिल्कुल ही है उन पर toString बुला का परिणाम की तुलना द्वारा

var foo = function() { 
    a = 1; 
}; 

var bar = function() { 
    a = 1; 
}; 

alert(foo.toString() == bar.toString());​ 

, तथापि, असफल हो जायेगी कि अगर वहां एक चरित्र है जो अलग है। यह देखने के लिए जांच कर रहे हैं कि क्या दो फ़ंक्शन एक ही चीज़ है, दूसरी तरफ, यह काफी असंभव है।

+0

आप सही हैं। पूरी तरह से काम किया ... – Basith

+25

लेकिन यह भी पूरी तरह से बेकार है। –

+4

बिलकुल नहीं! लॉनाश डिबॉन्स जैसे कार्यों के लिए यह आवश्यक है। – morels

13

समस्या यह है कि कार्यों पर समानता के विभिन्न विचार हैं।

  • संदर्भ समानता। कार्य स्मृति में कहीं भी संग्रहीत होते हैं, और एक निश्चित पते से शुरू होते हैं। संदर्भ फ़ंक्शन के अंदर दो फ़ंक्शन नाम (जो अनिवार्य रूप से पते हैं) के लिए आपको true iff दोनों नाम एक ही पते पर इंगित करते हैं। यह एक बात है जब आप एक bar = foo असाइन करते हैं। जावास्क्रिप्ट में संदर्भ समानता का उपयोग किया जाता है।
  • अन्य कोड में प्रस्तावित स्रोत कोड पर समानता। यदि आप फ़ंक्शन बॉडी में कोई भी चरित्र बदलते हैं तो यह काम नहीं करेगा। इसके अलावा, toSource वर्तमान में (2014 तक) केवल फ़ायरफ़ॉक्स में उपलब्ध है, क्योंकि यह डब्ल्यू 3 सी स्टैंडएटेड नहीं है।
  • स्रोत कोड पर सिंटेक्टिक समानताएं। रिक्त स्थान और टिप्पणियों में संशोधन के खिलाफ विरोध करने के लिए कोई अमूर्त वाक्यविन्यास पेड़ का उपयोग कर सकता है। लैम्ब्डा कैलकुस में परिभाषित अल्फा-समतुल्यता (यानी चर के निरंतरता का उपयोग कर सकते हैं), लेकिन
  • Extensional equality, जब कार्य समान होते हैं तो कार्य समान होते हैं।a theorem है जिसमें कहा गया है कि कार्यों की विस्तारित समानता की जांच करने के लिए केवल कोई एल्गोरिदम नहीं है, इसलिए यह निश्चित रूप से वह नहीं है जिसे आप खोज रहे हैं। हालांकि, जे एस की तुलना में कुछ अधिक उन्नत भाषाओं में वहाँ
  • Intensional समानता (जहां आप या तो साबित होता है कि कार्यों हाथ से बराबर हैं या अपने कार्यक्रम संकलन नहीं करता है) और
  • अवलोकन समानता (this one is too advanced to explain) कर रहे हैं।

तो, आप जो समानता मानते हैं उसका ख्याल रखें।

+4

यदि आप उनमें से प्रत्येक के लिए एक उदाहरण जोड़ सकते हैं, तो यह एक अच्छा जवाब देगा! –

0

सरल दृष्टिकोण: यदि आप हर बार इसे एक अनन्य आईडी वापस करने के लिए अपना सब्सक्राइब एपीआई लागू करते हैं, तो यह उस आईडी के साथ सदस्यता रद्द करने के लिए सरल होगा। आंतरिक परिदृश्य में आंतरिक रूप से आप सभी ग्राहकों को स्टोर करने के लिए एक सरल सरणी का उपयोग करेंगे, लेकिन इस दृष्टिकोण के साथ आपको स्टोर करना होगा। एक आईडी एक साधारण काउंटर हो सकता है कि आप प्रत्येक सब्सक्राइब कॉल के साथ बढ़ सकते हैं।

{ID: ग्राहक 'कॉलबैक फ़ंक्शन}

तो सब से अधिक ग्राहकों पुनरावृति जब आप सभी ग्राहकों के लिए प्रकाशित करना चाहते हैं।

उन्नत दृष्टिकोण: सब्सक्राइब एपीआई में एक साधारण फ़ंक्शन नाम को स्वीकार करने के बजाय, उस वर्ग की एक वस्तु को स्वीकार करें जिसमें मैसेज फ़ंक्शन होना चाहिए (या जो भी नाम आप इस विधि को देना चाहते हैं)। फिर आप स्वयं को अनियंत्रित करने के लिए सदस्यता रद्द करने के लिए ऑब्जेक्ट का एक ही उदाहरण पास कर सकते हैं। जब आपको ग्राहक को सूचित करने की आवश्यकता होती है तो आप सभी ग्राहकों के इंस्टेंस.ऑनमेज फ़ंक्शन का आह्वान कर सकते हैं। दो ऑब्जेक्ट संदर्भ की तुलना करना आसान है।

3

आप घटनाओं

https://github.com/nodejs/node/blob/master/lib/events.js

के लिए Node.js स्रोत को देखें, तो आप देख सकते हैं कि कोर टीम === का उपयोग करता है समानता

के लिए काम करता है की तुलना करने के मुझे यकीन है कि नहीं कर रहा हूँ === कैसे कार्यान्वित किया जाता है कार्यों के लिए, लेकिन मुझे यकीन है कि यह toString() नहीं है, क्योंकि दो अलग-अलग कार्यों में समान स्ट्रिंग() परिणाम हो सकता है, एलओएल

+1

यह जावास्क्रिप्ट के मानक व्यवहार के समान संदर्भ समानता जांच का उपयोग करता है: https://github.com/nodejs/node/blob/master/lib/events.js#L329 – SimplGy