2016-05-19 7 views
7

मुझे आश्चर्य है, मैं कभी-कभी ऐसे फ़ंक्शन क्यों देखता हूं जो फ़ंक्शन लौटाते हैं?फ़ंक्शन को वापस करने के लिए फ़ंक्शन का उपयोग क्यों करें?

उदाहरण के लिए

इस सवाल से इस सवाल का जवाब: AngularJS custom filter function

$scope.criteriaMatch = function(criteria) { 
    return function(item) { 
    return item.name === criteria.name; 
    }; 
}; 

क्या यह एक समारोह एक और समारोह है कि एक मान देता है देता है कि करने के लिए क्या मतलब है?

उत्तर

9

यह महत्वपूर्ण है कि लोग कार्य वापस करने वाले कार्यों के मूल्य को समझें; इस तकनीक का उपयोग करके आप कोड, जावास्क्रिप्ट दक्षता, और जावास्क्रिप्ट कितनी शक्तिशाली हो सकती है, इसकी एक समझ प्राप्त कर सकते हैं।
मैंने एक त्वरित उदाहरण बनाया है जिसे मैं आपको दिखाना चाहता हूं ताकि आप यह विचार प्राप्त कर सकें कि मैं संवाद करने की कोशिश कर रहा था।

मान लीजिए कि आप दोनों प्राप्त तरीकों के साथ दो बच्चे वस्तुओं के साथ एक मेजबान वस्तु है, और दोनों बिल्कुल एक ही काम करते हैं लेकिन एक अलग विशेषता के साथ करते हैं:

var accessors = { 
    sortable: { 
     get: function() { 
      return typeof this.getAttribute('sortable') != 'undefined'; 
     } 
    }, 
    droppable: { 
     get: function() { 
      return typeof this.getAttribute('droppable') != 'undefined'; 
     } 
    } 
}; 

एक ही कोड दोहरा आदर्श नहीं है, इसलिए हम एक बाहरी समारोह बना सकते हैं, यह एक विशेषता तर्क गुजर:

function getAttribute(attr) { 
    return typeof this.getAttribute(attr) != 'undefined'; 
} 

var accessors = { 
    sortable: { 
     get: function() { 
      return getAttribute('sortable'); 
     } 
    }, 
    droppable: { 
     get: function() { 
      return getAttribute('droppable'); 
     } 
    } 
}; 

ऐसा इसलिए है क्योंकि वहाँ एक अतिरिक्त, मध्यवर्ती समारोह निष्पादन हर बार विधि कहा जाता है एक बहुत बेहतर है लेकिन अभी भी आदर्श नहीं है।
क्या सबसे अच्छा काम करेगा एक समारोह है कि अंतिम समारोह लौट आए है - कि हर कॉल के साथ अतिरिक्त समारोह निष्पादन को खत्म करेगा पाने के लिए:

function generateGetMethod(attr) { 
    return function() { 
     return typeof this.getAttribute(attr) != 'undefined'; 
    }; 
} 

var accessors = { 
    sortable: { 
     get: generateGetMethod('sortable') 
    }, 
    droppable: { 
     get: generateGetMethod('droppable') 
    } 
}; 

क्या आपने ऊपर देखा, एक समारोह फ़ंक्शन है; प्रत्येक विधि को संपत्ति प्राप्त करने के लिए अपनी विधि मिलती है और प्रत्येक कॉल पर कोई ओवरहेड नहीं होता है।

यह वास्तव में उपयोगी तकनीक है जो आपको समान कोड दोहराने से बचाती है और, जब सही तरीके से उपयोग की जाती है, तो समझना और बनाए रखना आसान है!

+0

हाय, मैं फिर से यह जवाब पढ़ने के लिए आया और महसूस किया कि मैं अभी भी उलझन में हूं। क्या होगा अगर कोड उदाहरण के v2 में, आपको बस "get: getAttribute ('sortable')" मिला? क्या यह वही परिणाम नहीं लौटाएगा? जैसा कि "प्राप्त करें: जेनरेट विधि ('क्रमबद्ध')" – Synia

1

ऐसे कई मामले हैं जहां आप एक फ़ंक्शन वापस करना चाहते हैं। इस स्थिति में विशेष रूप से यह व्यवहार करता है कि कोणीय फ़िल्टर कैसे परिभाषित करता है। बाहरी कार्य किसी भी निर्भरता को संभालने के लिए है जिसे इंजेक्शन या किसी भी चर को निर्दिष्ट करने की आवश्यकता हो सकती है जिसे निर्दिष्ट करने की आवश्यकता हो सकती है। आंतरिक फ़ंक्शन एक वास्तविक संग्रह चरण है जो संग्रह पर एक छोटे संग्रह को वापस करने के लिए लागू होता है।

1

सभी कार्यात्मक भाषाओं और इसलिए जावास्क्रिप्ट के लिए ** Higher order functions * अनुमति देता है, जिसमें कार्यों भाषा के पहले वर्ग के सदस्यों के रूप में इलाज कर रहे हैं और एक अन्य समारोह से दूसरे कार्यों के लिए लौट आए या पैरामीटर के रूप में पारित किया जा सकता। इस तरह बातें सक्षम करने भाषा में बिजली का एक बहुत के लिए अनुमति देता है:

  1. क्लोजर: क्लोजर जानवर की फिर से विभिन्न प्रकार हैं और कॉलबैक के माध्यम से अतुल्यकालिक प्रोग्रामिंग करने के लिए शक्ति का एक बहुत कहते हैं। आप यहाँ बंद के बारे में अधिक पढ़ सकते हैं: https://developer.mozilla.org/en/docs/Web/JavaScript/Closures

  2. अमूर्त: जब आप एक समारोह कार्यक्षमता के केवल कुछ हिस्सा दिखाई लौटने के लिए, आप हमेशा इसके बारे में कुछ हिस्सा स्थानीय चर का उपयोग कर छुपा सकते हैं।आप या Currying जावा की तरह अन्य भाषाओं सी #

  3. में के रूप में public, private पहुँच विनिर्देशक नहीं है जिसमें यह जावास्क्रिप्ट की तरह एक भाषा में अमूर्त के लिए अनुमति देता है: आप चयनित विशेषताओं पर लागू लौटने कार्यों द्वारा जावास्क्रिप्ट में currying लागू कर सकते हैं । जैसे फ़ंक्शन योग को परिभाषित करें कि पैरामीटर को आंशिक रूप से लागू किया जा सकता है। sum(3)(4)

    function sum (a) { 
        return function (b) { 
        return a + b; 
        } 
    } 
    
  4. फैक्टरी पैटर्न: आप उच्च आदेश कार्यों का उपयोग कर सकते हैं कार्यों पैदा करते हैं और एक कारखाने के रूप में कार्य का उपयोग

केवल वजह से संभव जावास्क्रिप्ट भाषा में कई अन्य विशेषताएं हैं करने के लिए कार्यों को वापस करने की क्षमता।

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