2015-09-19 6 views
6

http://eloquentjavascript.net/1st_edition/chapter6.html में, वहाँ निम्नलिखित उदाहरण है:जावास्क्रिप्ट में फ़ंक्शन पास करते समय पैरामीटर कैसे प्रबंधित किए जाते हैं?

function negate(func) { 
    return function(x) { 
    return !func(x); 
    }; 
} 
var isNotNaN = negate(isNaN); 
alert(isNotNaN(NaN)); 

केवल बुनियादी जावास्क्रिप्ट और जरूरी प्रोग्रामिंग जानने के बाद, मैं इस प्रोग्रामिंग शैली द्वारा स्टम्प्ड रहा हूँ। क्या कोई मुझे समझने में मदद कर सकता है कि रनटाइम के दौरान क्या होता है।

मैंने कोड और निरीक्षण किए गए चर के माध्यम से कदम रखा और पाया कि x का मान NaN है। यह कैसे पता चलता है कि isNaN पर तर्क अज्ञात फ़ंक्शन के तर्क x के रूप में पारित किया जाना चाहिए? सबसे पहले, isNotNaN का वास्तविक पैरामीटर NaN क्यों isNaN (यानी isNaN को तर्क की अपेक्षा करता है, यह isNotNaN के तर्क से क्यों लेता है)?

+0

* तीसरी लाइन की वजह से "पहली जगह में, क्यों वास्तविक पैरामीटर' 'की NaN' isNotNaN'' isNaN' को तर्क बन जाता है "*:' समारोह (एक्स) '। 'func' 'isNaN' का संदर्भ है और' x' 'NaN' है। यह किसी भी अन्य कार्य से बहुत अलग नहीं है उदा। 'फ़ंक्शन foo (x) में {वापसी बार (x); }; foo (x) ',' foo' 'bar' के साथ' x' गुजरता है। आपके उदाहरण में एकमात्र अंतर यह है कि 'func' गतिशील रूप से निर्धारित किया जाता है। –

+0

** नोट ** यह फ़ंक्शन 'negate' सही ढंग से केवल उन कार्यों के साथ काम करता है जो केवल एक पैरामीटर – Grundy

उत्तर

1

यह समझने का सबसे अच्छा तरीका यह है कि ये चीज़ें वास्तव में बराबर होती हैं। ध्यान दें कि func उत्तीर्ण isNaN फ़ंक्शन बन जाता है।

function negate(func) { 
    return function(x) { 
    return !func(x); 
    }; 
} 
var isNotNaN = negate(isNaN); 
/* 

isNotNaN = function(x){ 
    return !isNaN(x) 
} 

*/ 

alert(isNotNaN(NaN)); 
+0

लेते हैं कि टिप्पणी ब्लॉक प्रबुद्ध है। हालांकि, 'x' का मान कहां से आता है जब नॉटएनएएनएन लागू होता है? –

+0

@ ओल्डजीज़र: आखिरी पंक्ति में: 'isNotNaN (NaN) '। आप 'NaN' गुजर रहे हैं, –

0

ध्यान दें कि negate दोनों एक फ़ंक्शन को एक तर्क के रूप में स्वीकार करते हैं और एक फ़ंक्शन देता है। लौटाए गए फ़ंक्शन रिटर्न मान को अस्वीकार करते हुए तर्क फ़ंक्शन को कॉल करेंगे। इस प्रकार, isNotNaN एक समारोह है। जब इसे कहा जाता है, तो यह मूल रूप से negate में फ़ंक्शन को कॉल करेगा, इस मामले में isNaN। जो भी आप isNotNaN पर कॉल करते हैं, उसे isNaN पर भेज दिया जाएगा।

संक्षेप में, आप को किसी अन्य फ़ंक्शन के साथ कॉन्फ़िगर कर रहे हैं। यह एक सरल (कोई तर्क समारोह) उदाहरण के साथ देखने के लिए आसान हो सकता है:

function addX(x) { 
    return function(y) { 
     return x+y; 
    }; 
} 

var add2 = addX(2); 
console.log(add2(2)); // 4 

var add3 = addX(3); 
console.log(add3(7)); // 10 

अब, यह एक कदम आगे ले और कल्पना करें कि आप एक मूल्य के बजाय addX में एक समारोह के पारित कर दिया।

वैसे, इसे currying कहा जाता है।

0

यह इसलिए क्योंकि आप इस सेट:

var isNotNaN = negate(isNaN); 

और जब isNotNaN बुला (एक्स) तो यह है की तरह आप निगेट (isNaN) कहते हैं (एक्स)। आप अज्ञात के बजाय नामित फ़ंक्शन का भी उपयोग कर सकते हैं ताकि हम कह सकें:

function negate(func) { 
     return xValue.call(this, x); //to be in the context of the xValue function 
     }; 
    } 
    var isNotNaN = negate(isNaN); 
    alert(isNotNaN(NaN)); 

    function xValue(x) { 
     return !func(x); 
    } 

    But then you have to take care about the context. 
संबंधित मुद्दे

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