दिलचस्प पोस्ट
ओरेकल: लेन-देन लंबित है या नहीं पता कैसे? Mysql स्थानीयहोस्ट! = 127.0.0.1? PHP में डायरेक्टरी ट्रैवर्सल को रोकना लेकिन पथ को अनुमति देना एक SqlCommand ऑब्जेक्ट से उत्पन्न एसक्यूएल कथन प्राप्त करें? PhpMyadmin में अधिकतम निष्पादन समय ऑरेकल के लिए MyBatis बैच डालें / अपडेट करें SQL सर्वर: अनुमति स्कीमा कैसे करें? Angular2 परिवर्तन का पता लगाने: ngOnChanges नेस्टेड ऑब्जेक्ट के लिए फायरिंग नहीं Raw_input पर समय सीमा कैसे निर्धारित करें अस्थायी-बिंदु संख्याओं में सटीकता की समस्याओं से निपटना एंड्रॉइड बाहरी संग्रहण निरपेक्ष पथ कैसे डीएडी RDD में कवर के तहत काम करता है? डेटा निर्देशिका में एंड्रॉइड में कोई पढ़ / लिखने की अनुमति नहीं है टॉमकेट 7 "सॉवर: एक बच्चा कंटेनर शुरू होने के दौरान विफल" विम में एक अधिक उपयोगी स्थिति?

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

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

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 प्राप्त करने की आवश्यकता है लेकिन मुझे एक त्रुटि मिली है: अनक्यूट टाइप एरर: संख्या फ़ंक्शन नहीं है

Solutions Collecting From Web of "जावास्क्रिप्ट में बंद – क्या गलत है?"

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

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