2016-08-15 12 views
8

आह्वान यह मेरे वर्तमान कोड है:ES6 तुरंत पुनरावर्ती तीर समारोह

const fn = parameter => { 
    // if, else ... 
    fn(X); 
}; 
fn(0); 

अब, मैं this approach उपयोग नहीं कर सकते के रूप में मैं एक पैरामीटर के साथ समारोह कॉल करने की आवश्यकता है और यह रिकर्सिवली प्रतिदेय होना चाहिए।

उपर्युक्त तीर फ़ंक्शन को तुरंत कैसे लागू किया जाए और फिर से कॉल करने योग्य कैसे किया जाए?

+0

तीर फ़ंक्शन का उपयोग न करें? –

उत्तर

2

यदि आप रिकर्सिव को lambda expression या पर कॉल करना चाहते हैं तो आपको Y combinator की आवश्यकता है। अधिक जानकारी के लिए आप भाज्य के लिए http://mvanier.livejournal.com/2897.html

पढ़ सकते हैं यह है

var Y = (proc) => { 
 
    return ((x) => { 
 
    return proc((y) => { return (x(x))(y);}); 
 
    })((x) => { 
 
    return proc((y) => { return (x(x))(y);}); 
 
    }); 
 
}; 
 

 
var factorial = (fact) => { 
 
return (n) => { 
 
    return (n === 0) ? 1 : n * fact(n-1); 
 
}; 
 
}; 
 

 

 
console.log(Y(factorial)(5));

की तरह आप कोड के लिए

const fn = (func)=> { 

    return (parameter) => { 
     // if else 
     func(X); 
    } 
}; 

Y(fn)(0); 
+0

यह सच हो सकता है, लेकिन यह स्वयं को शामिल नहीं किया गया है। मैं 'वाई (एफएन) (0); 'को हटाना चाहता हूं। यह समाधान एक और जटिल लगता है लेकिन मेरे जैसे ही परिणाम के साथ। – user3292653

9

पहले की तरह, मुझे त्याग कर दिया करते हैं यह हो जाएगा कि ईएस 6 में तत्काल-आमंत्रित-फ़ंक्शन-एक्सप्रेशन (आईआईएफई) considered bad practice हैं, और यह पूंछ-रिकर्स है आयन और व्यक्तिगत रूप से मैं इसे लूप के लिए बदल दूंगा।

लेकिन आप हमेशा यह कर सकते हैं मुझे लगता है कि:

((x) =>{ const fn=(p)=>{ 
     //whatever 
     fn(q) 
    } 
    fn(x) 
})(0) 
5

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

(function fn(parameter) { 
    // if, else ... 
    fn(x); 
})(0); 
+0

महान उत्तर। यह दिखाने के लिए चला जाता है कि तीर फ़ंक्शंस नामित फ़ंक्शन एक्सप्रेशन से हमेशा बेहतर नहीं होते हैं। – Reza

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