दिलचस्प पोस्ट
शुद्ध वर्ग में कैसे निपटाना है? नेविगेशन नियंत्रक के अंदर टैब बार नियंत्रक, या नेविगेशन रूट दृश्य साझा करना क्या इंटरनेट एक्सप्लोरर 8 एचटीएमएल 5 का समर्थन करता है? उचित संस्कृति के साथ स्ट्रिंग को दोहरे रूपांतरित करने के लिए कैसे करें इरोटोथिनेस द्वारा प्रधान संख्याएं एक साथ तुलना में तेज अनुक्रमिक हैं? JSP में समान रूप में सत्यापन और प्रदर्शन त्रुटि संदेश कैसे करें? LoadFile और लोड के बीच अंतर। नेट विधानसभाओं के साथ? आंतरिक त्रुटि 500 ​​अपाचे, लेकिन लॉग में कुछ नहीं? अजाक्स jquery सफलता के दायरे सभी भागने के पात्र क्या हैं? पायथन स्ट्रेटम () और समयक्षेत्र? विंडोज़ में होस्टिंग जीआईटी रिपॉजिटरी इन-ब्राउज़र स्क्रीनशॉट लेने के लिए HTML5 / Canvas / JavaScript का उपयोग करना PHPMyAdmin के साथ उपयोगकर्ता 'रूट' @ 'लोकलहोस्ट' के लिए प्रवेश निषेध डापर का उपयोग करके अपेक्षित से अधिक समय लेते हुए बल्क इन्सर्ट्स

जावास्क्रिप्ट में बंद – क्या गलत है?

मैं बंद करने के साथ अगले बनाने की कोशिश कर रहा हूं:

function func(number) { var result = number; var res = function(num) { return result + num; }; return res; } var result = func(2)(3)(4)(5)(3); console.log(result); // 17 

मुझे 2 + 3 + 4 + 5 + 3 = 17 प्राप्त करने की आवश्यकता है लेकिन मुझे एक त्रुटि मिली है: अनक्यूट टाइप एरर: संख्या फ़ंक्शन नहीं है

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट में बंद – क्या गलत है?"

आप अपने कार्यों का दुरुपयोग कर रहे हैं

func(2) res फ़ंक्शन देता है
उस समारोह को कॉल करने से (3) नंबर 5 ( return result + num )।

5 कोई फ़ंक्शन नहीं है, इसलिए (4) एक त्रुटि देता है

आपको किसी तरह श्रृंखला के अंत को सिग्नल करना होगा, जहां आप किसी अन्य फ़ंक्शन के बजाय परिणाम संख्या को वापस करने जा रहे हैं। तुम्हे जो पसंद है:

  • इसे किसी निश्चित समय के लिए एक फ़ंक्शन लौटाएगा – यह आपके लिए सिंटैक्स का उपयोग करने का एकमात्र तरीका है, लेकिन यह उबाऊ है। इसके लिए जवाब पॉलस 'को देखो आप पहले आविष्कार ( func(n) ) कर सकते हैं कि कितने तर्क sum की गई संख्या के लिए संख्या प्रदान की जाती है।
  • कुछ परिस्थितियों में परिणाम वापस लौटाएं, जैसे फ़ंक्शन को कोई तर्क (@ पॉलस 'दूसरा कार्यान्वयन) के साथ या एक विशेष मूल्य (@ अॉलग @ अॉलगःतालपल्लीकर के जवाब में) के साथ कहा जाता है।
  • फ़ंक्शन ऑब्जेक्ट पर एक विधि बना जो मान देता है। valueOf() अच्छी तरह से अनुकूल है क्योंकि यह कार्यान्वित किया जाता है जब फ़ंक्शन को एक आदिम मान में रखा जाता है। इसे कार्रवाई में देखें:

     function func(x) { function ret(y) { return func(x+y); } ret.valueOf = function() { return x; }; return ret; } func(2) // Function func(2).valueOf() // 2 func(2)(3) // Function func(2)(3).valueOf() // 5 func(2)(3)(4)(5)(3) // Function func(2)(3)(4)(5)(3)+0 // 17 

खैर, (2) (3) भाग सही है कॉलिंग फंक (2) आपको res वापस करने जा रहा है, जो फ़ंक्शन है। लेकिन फिर, कॉलिंग (3) आपको res का परिणाम वापस करने जा रहा है, जो एक संख्या है। इसलिए समस्या आती है जब आप कॉल करने की कोशिश करते हैं (4)।

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

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

 function sum(a, b) { return a + b; } a = [2, 3, 4, 5, 3]; b = a.reduce(sum); 

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

 function add() { var sum = 0; var closure = function() { sum = Array.prototype.slice.call(arguments).reduce(function(total, num) { return total + num; }, sum); return arguments.length ? closure : sum; }; return closure.apply(null, arguments); } console.log(add(1, 2, 7)(5)(4)(2, 3)(3.14, 2.86)); // function(){} console.log(add(1, 2, 7)(5)(4)(2, 3)(3.14, 2.86)()); // 30; 

हम एक सहायक सहायक फ़ंक्शन की identity और sumk का उपयोग करके इसे का हल्का काम कर सकते हैं।

sumk लंबित जोड़ कंप्यूटिंग के ढेर को रखने के लिए एक निरंतरता का उपयोग करता है और जब भी पहली () कहा जाता है तो 0 साथ स्टैक को खोलता है।

 const identity = x => x const sumk = (x,k) => x === undefined ? k(0) : y => sumk(y, next => k(x + next)) const sum = x => sumk(x, identity) console.log(sum()) // 0 console.log(sum(1)()) // 1 console.log(sum(1)(2)()) // 3 console.log(sum(1)(2)(3)()) // 6 console.log(sum(1)(2)(3)(4)()) // 10 console.log(sum(1)(2)(3)(4)(5)()) // 15 

यदि आप इसे लागू करना चाहते हैं, तो आपको फ़ंक्शन लौटने की आवश्यकता नहीं है जब तक कि आप अपना जवाब नहीं मांगते। उदाहरण के लिए 5 आमंत्रण

 function func(number) { var result = number, iteration = 0, fn = function (num) { result += num; if (++iteration < 4) return fn; return result; }; return fn; } func(2)(3)(4)(5)(3); // 17 

आप ऐसे कुछ भी कर सकते हैं जो इस तरह काम करता है

 function func(number) { var result = number, fn = function () { var i; for (i = 0; i < arguments.length; ++i) result += arguments[i]; if (i !== 0) return fn; return result; }; return fn; } func(2)(3, 4, 5)(3)(); // 17