2016-08-03 13 views
5

मैं "Eloquent JavaScript" पढ़ रहा हूं। अध्याय 3 "Closure" अवधारणा पेश करता है और आपको कुछ उदाहरण देता है। इनमें से एक अगला है:क्या कोई मुझे इस जावास्क्रिप्ट फ़ंक्शन का प्रवाह समझा सकता है? (क्लोजर अवधारणा)

function multiplier(factor) { 
    return function(number) { 
     return number * factor; 
    }; 
} 

var twice = multiplier(2); 
console.log(twice(5)); 
// → 10 

मुझे लगता है कि मैं अवधारणा को समझ गया। यदि पहले मैं console.log(twice) निष्पादित करता हूं, क्योंकि परिवर्तनीय number अपरिभाषित है, मुझे जो मिलता है वह [Function] है। मुझे समझ में नहीं आता कि कैसे twice(5) काम करता है। क्यों स्थानीय चर number मूल्य 5 के साथ शुरू किया गया है?

इसके अलावा, अगर मैं console.log(multiplier(2,5)) निष्पादित करता हूं तो मुझे परिणाम के रूप में 10 नहीं मिलता है?

धन्यवाद।

+0

@Sidenote: धन्यवाद! –

+0

यह एक [करीबी कार्य] है (http://stackoverflow.com/questions/2272902/make-this-syntax-possible-var-a-add23-5) – ftor

उत्तर

6

क्योंकि multiplier एक समारोह देता है, तो twice लौटे समारोह, नहीं multiplier समारोह के बराबर है।

हालांकि, multiplier को factor चर कहा जाता है और लौटाए गए फ़ंक्शन के भीतर उपयोग किया जाता है।

तो यह समझने में अधिक आसान बनाने के लिए, विचार है कि twice मूल रूप से है:

var twice = function(number) { 
    return number * 2; 
}; 

कहाँ factor मूल्य आप जब multiplier(2) बुला में पारित ने ले लिया है।


मुझे लगता है कि मैं अवधारणा को समझा। यदि पहले मैं console.log(twice) निष्पादित करता हूं, क्योंकि परिवर्तनीय संख्या अपरिभाषित है, मुझे जो मिलता है वह [Function] है।

जब आप का उपयोग console.log(twice) आप वास्तव में समारोह twice बुला नहीं कर रहे हैं, तो आप बस इसे का मूल्य प्रवेश कर रहे हैं। तो [Function] का आउटपुट इसलिए नहीं है क्योंकि number अपरिभाषित है, ऐसा इसलिए है क्योंकि आप इसके परिणामस्वरूप वास्तविक कार्य को आउटपुट कर रहे हैं।


इसके अलावा, क्यों अगर मैं console.log(multiplier(2,5)) निष्पादित मैं 10 एक परिणाम के रूप नहीं मिलता है?

यहाँ आप 2 तर्कों प्रदान करके multiplier बुला रहे हैं, हालांकि आप केवल एक पैरामीटर (factor) स्वीकार करने के लिए समारोह को परिभाषित किया है। जावास्क्रिप्ट में, इससे कोई त्रुटि नहीं आएगी, लेकिन आपको केवल factor (factor = 2) में मैप किया गया पहला मान मिलेगा।

नोट: वहाँ अभी भी सभी की आपूर्ति की बहस तक पहुँचने के लिए भले ही आप उन्हें के लिए परिभाषित (here's an example)

कुछ पैरामीटर जो ब्याज की हो सकती है 10 का एक परिणाम प्राप्त करने के लिए संभव हो जाएगा की जरूरत नहीं है तरीके हैं निम्नलिखित कोड का उपयोग करने की है: आप

console.log(multiplier(2,5)) 

पर अमल तो

var result = multiplier(2)(5); // result = 10 
+1

ठीक है। अब मैं इसे देखता हूँ। और मैं भी समझता हूं कि क्यों गुणक (2,5) वापस नहीं आ सकता 10. धन्यवाद साथी! –

+0

'कारक' अज्ञात फ़ंक्शन को पास नहीं किया गया है। यह फ़ंक्शन के भीतर पहुंच योग्य है, क्योंकि यह एक नि: शुल्क चर है और अनाम कार्य एक बंद है। यह भेद महत्वपूर्ण है, क्योंकि ढेर पर मुक्त चर ढेर पर संग्रहीत होते हैं। – ftor

+0

@ LUH3417: मैं कह रहा हूं कि 'गुणक' फ़ंक्शन कहलाता है जब कारक चर पारित किया जाता है। मैं यह नहीं कह रहा हूं कि यह अनाम कार्य को पास कर दिया गया है। मैं बस इतना कहता हूं कि यह * लौटा हुआ कार्य (अनाम) द्वारा * उपयोग किया जाता है। मुझे लगता है कि आपकी टिप्पणी किसी भी व्यक्ति के लिए पर्याप्त होगी जो आपके बयान को आपके तरीके से समझती है – musefan

1

आप समारोह दो पैरा दे रही है फोन मीटर, जबकि

function multiplier(factor) {} 

केवल एक पैरामीटर लेता है।

2

गुणक एक समारोह जो गुमनाम समारोह जो एक तर्क (संख्या) को स्वीकार करता है

var twice = multiplier(2); 

मूल रूप से है देता है: -

var twice = function(number) { 
     return number * 2; 
    }; 
संबंधित मुद्दे