জাভাস্ক্রিপ্টে "ফাংশন *" কী?


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*হতে বোঝানো হয়। এটা কি?

পিএস গুগল চেষ্টা করে বিরক্ত করবেন না, তারাটি ( তারা স্থানধারক হিসাবে ব্যবহৃত হয় ) দিয়ে অভিব্যক্তিগুলি অনুসন্ধান করা অসম্ভব


4
উদাহরণের মন্তব্যটি এখন বেশ পুরানো, function*ফায়ারফক্সে সিনট্যাক্স v26 থেকে সমর্থিত: বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স / * *। পুরানো সংস্করণগুলি একটি ভিন্ন বাক্য গঠন ব্যবহার করেছে।
নিকোলে

39
গুগল সম্পর্কিত, কেবল "ফাংশন তারকা" বা "ফাংশন তারকাচিহ্ন" অনুসন্ধান করুন। আমি এই প্রশ্নটি কীভাবে খুঁজে পেয়েছি;)।
ট্রাইসিস

2
দেখে মনে হচ্ছে *@ নিকোলে থেকে লিঙ্কটি ছিনিয়ে নেওয়া হয়েছে। এখানে MDN এ সরাসরিfunction* একটি লিঙ্ক । অবশ্যই নিশ্চিত, ভি 26 এর পরে "বেসিক" সমর্থন ।
ruffin

আরেকটি এমডিএন লিঙ্ক (যা,
ওপিতে লিঙ্কিত

আর একটি দরকারী এমডিএন লিঙ্ক: বিকাশকারী.মোজিলা.আর.ইন.ইউএস /
লোগান

উত্তর:


199

এটি জেনারেটরের কাজ।

জেনারেটরগুলি এমন ফাংশন যা বাইরে বের হওয়া এবং পরে পুনরায় প্রবেশ করা যেতে পারে। তাদের প্রসঙ্গ (ভেরিয়েবল বাইন্ডিংস) পুনরায় প্রবেশের মাধ্যমে সংরক্ষণ করা হবে।

জেনারেটর ফাংশন কল করা তার শরীরের তাত্ক্ষণিকভাবে কার্যকর করে না; পরিবর্তে ফাংশনটির জন্য একটি পুনরাবৃত্ত বস্তু ফিরে আসে। যখন পুনরুক্তির next()পদ্ধতিটি বলা হয়, জেনারেটরের ফাংশনটির শরীরটি প্রথম yieldএক্সপ্রেশন পর্যন্ত সঞ্চালিত হয় , যা পুনরুক্তিকারীর কাছ থেকে ফিরে আসার মান নির্দিষ্ট করে বা yield*অন্য জেনারেটরের ফাংশনে প্রতিনিধি প্রেরণ করে।


Noteতিহাসিক নোট:

এটি এর জন্য প্রস্তাবিত বাক্য গঠন EcmaScript.next

মজিলার ডেভ হারম্যান একমাস্ক্রিপ্ট.নেক্সট সম্পর্কে একটি বক্তব্য দিয়েছেন । এ 30:15 সে জেনারেটর কথা বলেছেন।

এর আগে, তিনি ব্যাখ্যা করেছেন যে মোজিলা কীভাবে কমিটি পরিচালনা করতে সাহায্য করার জন্য প্রস্তাবিত ভাষার পরিবর্তনের প্রয়োগ করছেন। ডেভ ব্রেন্ডান আইচ, মজিলার সিটিও (আমার মনে হয়) এবং মূল জাভাস্ক্রিপ্ট ডিজাইনারের সাথে ঘনিষ্ঠভাবে কাজ করে।

আপনি ECMAScript ওয়ার্কিং গ্রুপ উইকি সম্পর্কে আরো বিবরণ পেতে পারবেন: http://wiki.ecmascript.org/doku.php?id=harmony:generators

ওয়ার্কিং গ্রুপের (টিসি -৯৯) সাধারণ চুক্তি রয়েছে যে ইকামাস্ক্রিপ্ট.নেক্সটকে এক ধরণের জেনারেটর ইটারেটর প্রস্তাব রাখা উচিত, তবে এটি চূড়ান্ত নয়।

ভাষার পরবর্তী সংস্করণে কোনও পরিবর্তন ছাড়াই আপনার এই প্রদর্শন উপর নির্ভর করা উচিত নয় এবং এটি পরিবর্তন না হলেও এটি সম্ভবত কিছুক্ষণের জন্য অন্যান্য ব্রাউজারগুলিতে ব্যাপকভাবে প্রদর্শিত হবে না।

সংক্ষিপ্ত বিবরণ

প্রথম শ্রেণীর কর্টাইনগুলি, স্থগিতাদেশ কার্যকরকরণ প্রসঙ্গে (যেমন, ফাংশন অ্যাক্টিভেশন) এনক্যাপসুলেটিং অবজেক্ট হিসাবে উপস্থাপিত। পূর্ব শিল্প: পাইথন, আইকন, লুয়া, স্কিম, ছোট্টকল।

উদাহরণ

ফিবোনাচি সংখ্যাগুলির "অসীম" ক্রম (প্রায় 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
@Fergie, for(;;)হিসাবে একই while (true)। এটি এই প্রসঙ্গে ব্যবহৃত হয়েছে যেহেতু ফিবোনাচি সিকোয়েন্সটি একটি সীমাহীন ক্রম।
মাইক স্যামুয়েল

5
পূর্ব শিল্প: সি # ফলন?
ডেভ ভ্যান ডেন এয়েণ্ডে

3
@ ডেভভ্যান্ডেন এয়েন্ডে, পূর্বের শিল্প: পাইথনের ফলন। পূর্বের পূর্বের শিল্প: সিএলইউ এবং আইকন।
মাইক স্যামুয়েল

52

এটি একটি জেনারেটর ফাংশন - এবং আপনি যে পৃষ্ঠায় উদ্ধৃত করেছেন তাতে এটি "মন্তব্যে আকর্ষণীয় রেখা" এর পরিবর্তে দেওয়া মন্তব্যে এটি বলেছিল ...

মূলত এটি প্রোগ্রামিকভাবে সিকোয়েন্সগুলি নির্দিষ্ট করার একটি উপায় যাতে সেগুলি পুরো পাশ থেকে পেরিয়ে যায় এবং উপাদানগুলি পূর্বেই পুরো অনুক্রমের (সম্ভবত আকারে অসীম) গণনা না করে সূচক দ্বারা অ্যাক্সেস করতে পারে।


10
"সম্পূর্ণ ক্রমটি গণনা না করে সূচকের দ্বারা অ্যাক্সেস করা" সম্ভবত আমি এখনও পর্যন্ত জেনারেটরগুলি সম্পর্কে জেনারেটরগুলির সম্পর্কে ব্যাখ্যাগুলির সবচেয়ে সহায়ক বিট। আমি এটি কোনও অ্যাপ্লিকেশনটিতে ব্যবহার করে দেখতে পেয়েছি, যদিও এটি কেবল তাত্ত্বিকভাবে বোঝে।
ওয়েস্ট

11

function*টাইপ বলে মনে হচ্ছে প্রক্রিয়া iterated করা যেতে পারে একটি উত্পাদক ফাংশন হিসাবে কাজ করে। "ফলন ফেরত" দেখুন 1 এবং দেখুন 2 ব্যবহার করে সি # এর মতো বৈশিষ্ট্য রয়েছে

মূলত এটি প্রতিটি মান এই ফাংশনটি পুনরাবৃত্তি করে যা কিছু করে একে একে প্রদান করে, যার কারণে তাদের ব্যবহারের ক্ষেত্রে এটি একটি ফোরচ স্টাইল লুপে দেখায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.