2015-01-05 8 views
30

क्या कोई मुझे समझा सकता है: ईस्टर 6 में जेनरेटर फ़ंक्शंस तारांकन प्रतीक द्वारा चिह्नित क्यों हैं?ईएस 6 जेनरेटर कार्यों में तारांकन (*) का उद्देश्य क्या है

उदाहरण के लिए, के बजाय:

function *someGenerator() { 
    yield 1; 
    yield 2; 
    yield 3; 
} 

हम लिख सकते हैं:

function someGenerator() { 
    yield 1; 
    yield 2; 
    yield 3; 
} 

या यहाँ तक कि:

var someGenerator =() => { 
    yield 1; 
    yield 2; 
    yield 3; 
} 

var someObject = { 

    someGenerator() { 
     yield 1; 
     yield 2; 
     yield 3; 
    } 
}    

जे एस संकलक पता लगा सकते हैं कि someGenerator पर yield ऑपरेटर शामिल पार्स समय और टी से जनरेटर बनाते हैं उसका काम

yield अस्तित्व का पता लगाने का पर्याप्त क्यों नहीं है?

+0

मैं ES6 के बारे में ज्यादा पता नहीं है, लेकिन मुझे पता है कि तारांकन 'function' कीवर्ड के लिए अद्वितीय नहीं है। - आप 'उपज *' का भी उपयोग कर सकते हैं। –

+0

इसे पढ़ें https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function* –

+0

@JamesDonnelly हां, आप 'उपज *' का उपयोग कर सकते हैं। तो मेरा सवाल यह है कि क्यों संकलक यह पता लगा सकता है कि फ़ंक्शन जनरेटर 'उपज' (या 'उपज * ') अस्तित्व से है? – alexpods

उत्तर

40

तीन कारण थे:

  1. पठनीयता। एक जनरेटर एक समारोह से काफी अलग है, और अंतर तुरंत दिखाई देना चाहिए (यानी, उपज की खोज में पूरे कार्यान्वयन की जांच किए बिना)।

  2. सामान्यता। जेनरेटर लिखना स्वाभाविक रूप से संभव होना चाहिए जो उपज नहीं करते हैं, और केवल सीधे लौटते हैं। इसके अलावा, शरीर के हिस्से (जैसे डीबगिंग के लिए) पर टिप्पणी करना चुपचाप बदलना चाहिए कि कुछ जनरेटर है या नहीं।

  3. संगतता। केवल सख्त मोड एक कीवर्ड के रूप में 'उपज' आरक्षित है, लेकिन इसे ES6 के लिए एक लक्ष्य बनाया गया था कि सभी नई विशेषताएं मैला मोड में भी उपलब्ध हैं (एक दुर्भाग्यपूर्ण निर्णय IMHO, लेकिन फिर भी)।इसके अलावा, सख्त मोड में भी 'उपज' के आस-पास कई पार्सिंग सूक्ष्मताएं हैं; उदाहरण के लिए, डिफ़ॉल्ट तर्क पर विचार करें:

    function* g(a = yield(2)) { 'use strict' } 
    

    * के बिना, पार्सर केवल बात का निर्णय कर कैसे उपज पार्स करने के लिए के बाद यह समारोह के शरीर को देखा है। यही है, आपको इससे निपटने के लिए अनंत दिखने, या बैक-ट्रैकिंग, या अन्य हैकी तकनीकों की आवश्यकता होगी।

मुझे ध्यान रखना चाहिए कि (1) और (2) पहले से ही पर्याप्त कारण हैं।

(पूर्ण प्रकटीकरण:। मैं ECMAScript समिति के एक सदस्य हूँ)

+0

बनाने के बजाए पहले कोड-ब्रेकिंग प्रतीक सजावट चुना है, हाँ, मुझे आपके अंक मिल गए हैं। धन्यवाद। मुझे लगता है कि कोई भी बेहतर व्याख्या नहीं कर सकता है, इसलिए अपने उत्तर को उपयुक्त के रूप में चिह्नित करें। – alexpods

+0

मैं जिस अवसर से पूछना चाहता हूं उसका उपयोग करना: ईसीएमएस्क्रिप्ट समिति एरे जेनरेटर (जैसे कुछ ((* * => {} ') और ऑब्जेक्ट लिटरल के जेनरेटर विधियों (कुछ varObject = {* someGenerator() {} जैसी कुछ योजनाओं के बारे में कोई योजना है } ')? चूंकि आईएमएचओ 'फ़ंक्शन *' बहुत सारे प्रतीक हैं। और सरणी जेनरेटर के बिना हमें '.bind (this)' या 'var that = this' पुराने es5 दिनों में उपयोग करना होगा। – alexpods

+2

@alexpods, जेनरेटर विधियां ('{* जी() {}}') पहले ही ईएस 6 में हैं। तीर जनरेटर पर एक से अधिक बार चर्चा की गई थी, लेकिन कोई भी वाक्यविन्यास के साथ आने में सक्षम नहीं था जो लगातार था और इसमें कोई समस्या नहीं थी। –

6

खाली जेनरेटर (बिना शरीर के) को अस्वीकार नहीं किया जाता है; तो unStarredFunc() जेनरेटर अर्थशास्त्र का पालन करना चाहिए या नहीं?

संगतता कारणों के लिए:

function yield(x) { return x }; 

function a() { 
    yield (4+1); 
}; 

इस वाक्य रचना सही है लेकिन बुला .next() स्पष्ट रूप से एक जनरेटर परिभाषित करने के लिए एक तारक जोड़ने जबकि एक त्रुटि में परिणाम होगा कारण .next().value === 5

का पता लगाने होता है कि someGenerator उपज होता है पार्स समय पर ऑपरेटर

कुछ विपक्ष tructs पार्स समय में हल नहीं किया जा सकता है:

function someGenerator(i) { 
    if (glob) 
     return 4; 
    else 
     yield* anotherGen(i); 
} 

और हां अपनी सरल की function* परिभाषा से तुरंत देखने के लिए कि अपने अपने स्रोत में खुदाई करने के लिए पैदावार देखने के लिए जरूरत के बिना एक जनरेटर।

+0

1) संगतता कारणों के लिए - हाँ, मैं इसके साथ सहमत हूं। लेकिन आप 'सख्त उपयोग' के तहत नई प्राप्ति को कवर कर सकते हैं। यदि 'यील्ड' से निर्दिष्ट' सख्त 'का उपयोग ऑपरेटर के रूप में किया जाता है। अन्यथा, यदि इस तरह के नाम के साथ कार्य को एहसास हुआ, - 'उपज' को फ़ंक्शन के रूप में व्याख्या किया जाता है, और आपको उससे जेनरेटर बनाने के लिए फ़ंक्शन में तारांकन '*' जोड़ने की आवश्यकता होती है। – alexpods

+0

अच्छा जवाब। वैसे, यहां तक ​​कि एक गैर-खाली कार्य भी जनरेटर के रूप में काम नहीं कर सकता है जिसमें कोई उपज नहीं है। यह 'वापसी' कथन के मूल्य के साथ 'मूल्य' के रूप में अगले कॉल पर 'किया गया' देता है। –

+0

2) 'कुछ संरचनाओं को पार्स टाइम पर हल नहीं किया जा सकता है' - वास्तव में आपका उदाहरण जेनरेटर है, और यह एक पार्स टाइम को हल कर सकता है। तर्क सरल है - 'उपज' (या 'उपज *' मौजूद है) यह जनरेटर है। अन्यथा - इसका कार्य। आखिरकार, आप वर्तमान es6 प्राप्ति में सशर्त फ़ंक्शन/जनरेटर फ़ंक्शन नहीं बना सकते हैं। – alexpods

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