2009-10-19 18 views
8

हाल ही में मैंने जावास्क्रिप्ट कोड का यह टुकड़ा देखा है, लेकिन यह समझने में असमर्थ रहा है कि यह क्या करने का प्रयास कर रहा है।"रिटर्न फ़ंक्शन() {...}" जावास्क्रिप्ट में क्या करता है?

var f = function(a) { 
    return function() { 
     alert(a()); 
    }; 
}; 
f(function() { return "Hello World"; })(); 

कृपया यह बताएं कि यह क्या पूरा करता है!

+0

** डाउनवोट **: डी क्योंकि यह इतना मुश्किल नहीं था जितना मैं सोच रहा था? –

+0

** upvote ** - क्योंकि प्रथम क्रम कार्य, और विशेष रूप से फ़ंक्शन कॉल से लौटाए गए फ़ंक्शन का आविष्कार (उदा। 'F()() ') * * वास्तव में भ्रमित दिखता है जब तक आप इसे" प्राप्त नहीं करते "। –

+0

बधाई, राकेश जुयाल! आप अभी _functional प्रोग्रामिंग_ पर ठोकर खाई है! मैं आपके लिए बहुत खुश हूं * सोब * –

उत्तर

9

यह उस कार्य को निष्पादित करता है जो एफ रिटर्न देता है।
एफ एक ऐसा फ़ंक्शन देता है जो एक चेतावनी को कॉल करता है जो आपके द्वारा f पर पैरामीटर के रूप में दिए गए फ़ंक्शन के आउटपुट को प्रदर्शित करता है।

संपादित करें: बस इसे आंखों पर आसान बनाने के लिए कुछ भागों स्थानापन्न और तुम अपने आप देखेंगे:

var f = function(a) { 
    var output = a(); 
    var alertCaller = function() { 
     alert(output); 
    }; 
    return alertCaller; 
}; 

var helloWorld = function() { return "Hello World"; } 
var result = f(helloWorld); //f takes a function as argument 
result(); //result must be a function 
+0

मोक्स, शायद आप सही हैं, लेकिन क्या आप इसे समझाएंगे। –

+1

'एफ' * एक समारोह है। – nickf

+0

एफ एक ऐसा फ़ंक्शन है जो फ़ंक्शन स्वीकार करता है (इसे * arg1 * कहता है) और एक फ़ंक्शन देता है जो फ़ंक्शन * arg1 * द्वारा लौटाए गए मान को प्रदर्शित करेगा? क्या ये सही है ? –

3

"हैलो वर्ल्ड" प्रदर्शित करने के लिए अलर्ट बॉक्स प्राप्त करने का यह एक बहुत ही जटिल तरीका है। कार्य जावास्क्रिप्ट में प्रथम श्रेणी के आइटम हैं, और पैरामीटर के रूप में अन्य कार्यों से और पास किए जा सकते हैं।

2

इस कोड को एक समारोह जनरेटर पैदा करता है। पहला फ़ंक्शन (जिसका संदर्भ f में संग्रहीत है) किसी अन्य फ़ंक्शन (a) के संदर्भ को स्वीकार करता है। फिर f एक ऐसा फ़ंक्शन बनाता है जो पैरामीटर a पर बंद हो जाता है और नए फ़ंक्शन का संदर्भ देता है जो a's के वापसी मूल्य को चेतावनी देगा।

अंततः इस गड़बड़ को इनलाइन फ़ंक्शन के साथ बुलाया जाता है और इसके परिणाम तुरंत लागू होते हैं (अंत में पिछली खुली और नज़दीकी कोष्ठक के साथ)।

6

यह सिर्फ एक उच्च स्तरीय फ़ंक्शन है, जो इस मामले में वास्तव में आवश्यक नहीं है।

f एक समारोह है कि एक और समारोह (a कहा जाता है), और रिटर्न एक नव उत्पन्न समारोह है कि a का मूल्यांकन करें और परिणाम दिखा अलर्ट बॉक्स पॉप अप होगा लेता है।

तो नीचे की रेखा एफ को कॉल करती है (एक अज्ञात फ़ंक्शन में गुजरती है जो "हैलो वर्ल्ड" प्रिंट करती है), फिर f द्वारा लौटाए गए अज्ञात फ़ंक्शन को तुरंत प्रकाशित करती है - जिसमें पारित तर्क का मूल्यांकन किया जाएगा (जिसे आप रिटर्न देख सकते हैं "हैलो वर्ल्ड ") और उसके बाद एक अलर्ट बॉक्स पॉप अप करता है।

कोड तैनात कार्यात्मक बराबर करने के लिए

alert("Hello World"); 

है, लेकिन है कि यह अधिक जटिल बना दो अतिरिक्त तत्वों है:

  1. आपको स्ट्रिंग उत्पन्न करने के लिए एक मनमाना समारोह में पारित कर सकते हैं जो अलर्ट बॉक्स में दिखाई देता है (और यह आलसी मूल्यांकन किया जाएगा, जो महत्वपूर्ण हो सकता है - उदाहरण के लिए वर्तमान समय/ऐप स्थिति/मेमोरी उपयोग मुद्रित करने के लिए एक फ़ंक्शन को अलर्ट दिखाया गया है जब विधि बनाई गई थी तब से एथर)।
  2. आप एक बंदरगाह उत्पन्न कर सकते हैं जो इस चेतावनी को दिखाएगा और उसके बाद तुरंत चेतावनी निष्पादित करने के बजाए इसे पास कर देगा।

लेकिन चूंकि इनमें से कोई भी लाभ वास्तव में कोड स्निपेट में उपयोग नहीं किया जाता है, इसलिए मैं देख सकता हूं कि आप उलझन में क्यों होंगे।

+0

+1 –

0

f एक फ़ंक्शन असाइन किया गया है जो फ़ंक्शन को इसके तर्क के रूप में लेता है, इसे आमंत्रित करता है, और alert में अपना रिटर्न मान प्रदर्शित करता है। फिर f को ऐसे फ़ंक्शन के साथ बुलाया जाता है जो स्ट्रिंग "Hello World" लौटाता है, जिसके परिणामस्वरूप Hello World एक अलर्ट में प्रदर्शित होता है।

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