जावास्क्रिप्ट में "फ़ंक्शन *" क्या है?


243

में इस पेज मैंने पाया एक नया जावास्क्रिप्ट समारोह के प्रकार:

// NOTE: "function*" is not supported yet in Firefox.
// Remove the asterisk in order for this code to work in Firefox 13 

function* fibonacci() { // !!! this is the interesting line !!!
    let [prev, curr] = [0, 1];
    for (;;) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

मैं पहले से ही पता क्या yield, letऔर [?,?]=[?,?]क्या करना है, लेकिन पता नहीं क्या है function*करने के लिए है। यह क्या है?

PS Google को आज़माने से परेशान नहीं है, इसके लिए एस्टेरिक्स ( वे प्लेसहोल्डर के रूप में उपयोग किए जाते हैं ) के साथ अभिव्यक्ति की खोज करना असंभव है ।


4
उदाहरण में टिप्पणी अब काफी पुरानी है, function*फ़ायरफ़ॉक्स को v26 के बाद से फ़ायरफ़ॉक्स में समर्थित किया गया है: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *। पुराने संस्करणों ने एक अलग वाक्यविन्यास का उपयोग किया।
निकोलय

39
Google के बारे में, बस "फ़ंक्शन स्टार" या "फ़ंक्शन तारांकन" खोजें। यही कारण है कि मुझे यह सवाल मिला;)।
22

2
लगता है जैसे *@Nickolay से लिंक छीन लिया गया। यहां एमडीएन पर सीधेfunction* लिंक दिया गया है । पर्याप्त है, v26 के बाद से "बुनियादी" समर्थन ।
रफिन

एक और एमडीएन लिंक (जो, वैसे, मुझे ओपी द्वारा लिंक किए गए
एमडीएन

एक अन्य उपयोगी एमडीएन लिंक: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *
लोगान

जवाबों:


199

यह एक जनरेटर फ़ंक्शन है।

जनरेटर वे कार्य हैं जिन्हें बाहर निकाला जा सकता है और बाद में फिर से प्रवेश किया जाता है। उनके संदर्भ (वैरिएबल बाइंडिंग) को पुन: प्रवेश द्वारों पर सहेजा जाएगा।

एक जनरेटर फ़ंक्शन को कॉल करना उसके शरीर को तुरंत निष्पादित नहीं करता है; फ़ंक्शन के लिए एक पुनरावृत्ति ऑब्जेक्ट इसके बजाय लौटाया जाता है। जब इट्रेटर की next()विधि को बुलाया जाता है, तो जनरेटर फ़ंक्शन के निकाय को पहले yieldअभिव्यक्ति तक निष्पादित किया जाता है , जो इट्रेटर से लौटाए जाने वाले मूल्य को निर्दिष्ट करता है या, yield*किसी अन्य जनरेटर फ़ंक्शन को डेलिगेट करता है।


ऐतिहासिक नोट:

यह एक प्रस्तावित वाक्यविन्यास है EcmaScript.next

मोज़िला के डेव हरमन ने EcmaScript.next के बारे में बात की । पर 30:15 वह जनरेटर के बारे में बात करती है।

इससे पहले, वह बताते हैं कि कैसे मोज़िला प्रयोगात्मक रूप से प्रस्तावित भाषा परिवर्तनों को लागू करने में मदद कर रही है ताकि समिति को मदद मिल सके। डेव ब्रेंडन ईच, मोज़िला के सीटीओ (मुझे लगता है), और मूल जावास्क्रिप्ट डिजाइनर के साथ मिलकर काम करता है।

आप EcmaScript वर्किंग ग्रुप विकी पर अधिक विवरण पा सकते हैं: http://wiki.ecmascript.org/doku.php?id=harmony:generators

कार्य समूह (TC-39) के पास सामान्य सहमति है कि EcmaScript.next में किसी प्रकार का जनरेटर इट्रेटर प्रस्ताव होना चाहिए, लेकिन यह अंतिम नहीं है।

आपको भाषा के अगले संस्करण में बदलाव के बिना इस पर भरोसा नहीं करना चाहिए, और अगर यह नहीं बदलता है, तो यह संभवतः कुछ समय के लिए अन्य ब्राउज़रों में व्यापक रूप से दिखाई नहीं देगा।

अवलोकन

प्रथम श्रेणी के कोरटाइन को निलंबित निष्पादन संदर्भों (यानी, फ़ंक्शन सक्रियण) को संलग्न करने वाली वस्तुओं के रूप में दर्शाया गया है। पूर्व कला: पायथन, आइकन, लुआ, स्कीम, स्मॉलटाक।

उदाहरण

फाइबोनैचि संख्याओं का "अनंत" क्रम (2 53 के आसपास व्यवहार के बावजूद ):

function* fibonacci() {
    let [prev, curr] = [0, 1];
    for (;;) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

जेनरेटरों को छोरों पर प्रसारित किया जा सकता है:

for (n of fibonacci()) {
    // truncate the sequence at 1000
    if (n > 1000)
        break;
    print(n);
}

जनरेटर चलने वाले हैं:

let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8

7
अनुवर्ती करें: कोई पैरामीटर के साथ लूप के लिए क्या करता है ( for(;;))? इस संदर्भ में इसका उपयोग क्यों करें?
फर्जी

13
@ फर्जी, के for(;;)रूप में ही है while (true)। इसका उपयोग इस संदर्भ में किया जाता है, क्योंकि फाइबोनैचि अनुक्रम एक निर्बाध अनुक्रम है।
माइक सैमुअल

5
पूर्व कला: सी # उपज?
डेव वान डे आईन्डे

3
@DaveVandenEynde, पूर्व-पूर्व कला: अजगर की उपज। पहले की पूर्व कला: सीएलयू और आइकन।
माइक सैमुअल

52

यह एक जनरेटर फ़ंक्शन है - और यह कहा गया है कि आप जिस पृष्ठ का हवाला देते हैं, टिप्पणी में आपने "यह दिलचस्प पंक्ति है" के साथ प्रतिस्थापित किया है ...

मूल रूप से यह क्रमबद्ध रूप से अनुक्रम निर्दिष्ट करने का एक तरीका है ताकि वे पूरे अनुक्रम (संभवतः आकार में अनंत) की गणना किए बिना इंडेक्स द्वारा एक्सेस किए गए तत्वों और आस-पास से गुजर सकें।


10
"पूरे अनुक्रम की गणना किए बिना इंडेक्स द्वारा एक्सेस किया गया" संभवतया मेरे द्वारा अब तक आए जनरेटर के बारे में स्पष्टीकरण का सबसे सहायक बिट है। मैं इसे एक ऐप में इसका इस्तेमाल करते हुए देख सकता था।
वेस

11

function*प्रकार दिखता है जैसे कि यह प्रक्रियाओं है कि दोहराया जा सकता है के लिए एक जनरेटर समारोह के रूप में कार्य करता है। C # में इस तरह की सुविधा है कि "यील्ड रिटर्न" 1 देखें और 2 देखें

अनिवार्य रूप से यह प्रत्येक मान को एक-एक करके इस फ़ंक्शन को पुनरावृत्त कर रहा है, यही वजह है कि उनका उपयोग मामला फ़ॉरच स्टाइल स्टाइल लूप में दिखाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.