ECMAScript 6 এ কখন তীর ফাংশন ব্যবহার করা উচিত?


406

প্রশ্নটি আসন্ন ইসমাস্ক্রিপ্ট upcoming (সুরেলা) এর প্রসঙ্গে কোড শৈলীর বিষয়ে চিন্তাভাবনা করেছেন এবং যারা ইতিমধ্যে ভাষা নিয়ে কাজ করেছেন তাদের দিকে প্রশ্নটি নির্দেশিত হয়।

ES6 এ ফাংশন লেখার সাথে () => {}এবং function () {}আমরা দুটি একই ধরণের উপায় পাচ্ছি। অন্যান্য ভাষায় ল্যাম্বডা ফাংশনগুলি প্রায়শই বেনামে হয়ে নিজেদের আলাদা করে, তবে ইসমাস্ক্রিপ্টে কোনও ফাংশন বেনামে থাকতে পারে। দুটি ধরণের প্রত্যেকেরই অনন্য ব্যবহারের ডোমেন থাকে (যথা যখন thisহয় স্পষ্টভাবে বা সুস্পষ্টভাবে আবদ্ধ হওয়া আবশ্যক) তখন আবদ্ধ নয়) এই ডোমেনগুলির মধ্যে এমন একটি বিশাল সংখ্যক কেস রয়েছে যেখানে উভয়ই স্বীকৃতি দেবে।

ES6 এ তীর ফাংশনগুলির কমপক্ষে দুটি সীমাবদ্ধতা রয়েছে:

  • সাথে কাজ করবেন না newএবং তৈরি করার সময় ব্যবহার করা যাবে নাprototype
  • সূচনাতে thisসুযোগের জন্য আবদ্ধ স্থির bound

এই দুটি সীমাবদ্ধতা একপাশে রেখে তীর ফাংশনগুলি তাত্ত্বিকভাবে প্রায় কোথাও নিয়মিত ফাংশনগুলি প্রতিস্থাপন করতে পারে। বাস্তবে সেগুলি ব্যবহার করে সঠিক পন্থাটি কী? তীর ফাংশন ব্যবহার করা উচিত যেমন:

  • "সর্বত্র তারা কাজ করে", অর্থাৎ সর্বত্র একটি ক্রিয়াকলাপটি thisভেরিয়েবল সম্পর্কে অজ্ঞাব্য হতে হবে না এবং আমরা একটি বস্তু তৈরি করছি না।
  • কেবলমাত্র "সর্বত্র তাদের প্রয়োজন হয়", যেমন ইভেন্ট শ্রোতা, সময়সীমা, যা একটি নির্দিষ্ট সুযোগে আবদ্ধ হওয়া দরকার
  • 'শর্ট' ফাংশন সহ তবে 'দীর্ঘ' ফাংশনগুলির সাথে নয়
  • কেবল এমন ক্রিয়াকলাপগুলিতে যা অন্য তীর ফাংশন ধারণ করে না

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


33
আপনি Fixed this bound to scope at initialisationএকটি সীমাবদ্ধতা হিসাবে বিবেচনা ?
thefourtheye

12
এটি একটি সুবিধা, তবে যদি আপনি মূল প্রসঙ্গে বাইরে ফাংশনটি পুনরায় ব্যবহার করার পরিকল্পনা করেন তবে এটি একটি সীমাবদ্ধতাও হতে পারে। উদাহরণস্বরূপ যখন অবজেক্ট.প্রোটোটাইপের মাধ্যমে গতিময় কোনও শ্রেণিতে কোনও ফাংশন যুক্ত করা হয়। আমি 'সীমাবদ্ধতা' বলতে যা বোঝায় তা হ'ল এর মান পরিবর্তন করা thisএমন কিছু যা আপনি নিয়মিত ফাংশন দিয়ে করতে পারেন তবে তীর ফাংশন দিয়ে নয়।
14:07

1
সত্যই আমি মনে করি কোডিং শৈলীর নির্দেশিকা বরং মতামতযুক্ত। আমাকে ভুল করবেন না, আমি মনে করি সেগুলি গুরুত্বপূর্ণ, তবে একটি একক গাইডলাইন নেই যা সবার জন্য উপযুক্ত।
ফেলিক্স ক্লিং

আমি মনে করি না Fixed this bound to scope at initialisationএটি একটি সীমাবদ্ধতা। :) এই নিবন্ধটি একবার দেখুন: exploringjs.com/es6/ch_arrow-funifications.html
NgaNguyenDuy

3
@ থেফোর্তে, "সীমাবদ্ধতা" এর অর্থ এখানে "সীমাবদ্ধতা কারণ একজন বোবা স্বয়ংক্রিয় কোড অনুবাদক অন্ধভাবে একে অপরের সাথে প্রতিস্থাপন করতে পারেন নি এবং ধরে নিতে পারেন যে সবকিছু প্রত্যাশিতভাবে চলবে"।
পেসারিয়ার

উত্তর:


322

কিছুক্ষণ আগে আমাদের দলটি তার সমস্ত কোড (একটি মাঝারি আকারের অ্যাঙ্গুলারজেএস অ্যাপ্লিকেশন) ট্রেসার বাবেল ব্যবহার করে সংকলিত জাভাস্ক্রিপ্টে স্থানান্তরিত করেছে । আমি এখন ES6 এবং এর বাইরেও ফাংশনের জন্য নীচের নিয়মটি ব্যবহার করছি:

  • functionবিশ্বব্যাপী সুযোগ এবং Object.prototypeবৈশিষ্ট্যের জন্য ব্যবহার করুন ।
  • classঅবজেক্ট কনস্ট্রাক্টরগুলির জন্য ব্যবহার করুন ।
  • =>অন্য কোথাও ব্যবহার করুন ।

তীর কাজগুলি প্রায় সর্বত্র কেন ব্যবহার করবেন?

  1. স্কোপ সুরক্ষা: যখন তীর ফাংশনগুলি ধারাবাহিকভাবে ব্যবহৃত হয়, সমস্ত কিছুই thisObjectমূল হিসাবে একই ব্যবহারের গ্যারান্টিযুক্ত । এমনকি যদি একটি একক স্ট্যান্ডার্ড ফাংশন কলব্যাক একগুচ্ছ তীর ফাংশনের সাথে মিশ্রিত হয় তবে সুযোগটি নষ্ট হয়ে যাওয়ার সম্ভাবনা রয়েছে।
  2. সংক্ষিপ্ততা: তীর ফাংশনগুলি পড়া এবং লেখার পক্ষে সহজ। (এটি মতামতযুক্ত বলে মনে হতে পারে তাই আমি আরও কয়েকটি উদাহরণ দেব)।
  3. স্পষ্টতা: যখন প্রায় সমস্ত কিছুই একটি তীর ফাংশন হয়, কোনও নিয়মিত functionতাত্ক্ষণিকভাবে সুযোগটি সংজ্ঞায়িত করতে শুরু করে। একজন বিকাশকারী সর্বদা পরবর্তী-উচ্চতর functionবিবৃতিটি কী তা দেখতে সন্ধান করতে পারে thisObject

কেন সর্বদা বিশ্বব্যাপী সুযোগ বা মডিউল স্কোপগুলিতে নিয়মিত ফাংশন ব্যবহার করবেন?

  1. অ্যাক্সেস করা উচিত নয় এমন একটি ফাংশন নির্দেশ করতে thisObject
  2. windowবস্তু (বিশ্বব্যাপী সুযোগ) সেরা স্পষ্টভাবে সম্বোধন করা হয়েছে।
  3. অনেক Object.prototypeসংজ্ঞা বিশ্বব্যাপী স্কোপে থাকে (ভাবুন String.prototype.truncateইত্যাদি) এবং সেগুলি সাধারণত যে functionকোনওভাবে টাইপের হতে হবে । অবিচ্ছিন্নভাবে functionবিশ্ব স্কোপ ব্যবহার করা ত্রুটিগুলি এড়াতে সহায়তা করে।
  4. গ্লোবাল স্কোপটিতে অনেকগুলি ফাংশন হ'ল পুরানো-শৈলীর শ্রেণির সংজ্ঞাগুলির জন্য অবজেক্ট কনস্ট্রাক্টর।
  5. ফাংশনগুলির নাম দেওয়া যেতে পারে 1 । এর দুটি সুবিধা রয়েছে: (1) অন্য ফাংশন কলগুলির বাইরে বিশেষত এটি লেখার function foo(){}চেয়ে কম বিশ্রী const foo = () => {}। (২) ফাংশনের নামটি স্ট্যাক ট্রেসগুলিতে দেখায়। যদিও প্রতিটি অভ্যন্তরীণ কলব্যাকের নামকরণ করা ক্লান্তিকর হবে, সমস্ত পাবলিক ফাংশনগুলির নামকরণ সম্ভবত একটি ভাল ধারণা।
  6. ফাংশন ঘোষণাগুলি উত্তোলন করা হয় , (যার অর্থ তারা ঘোষণার আগে এগুলি অ্যাক্সেস করা যায়), যা একটি স্ট্যাটিক ইউটিলিটি ফাংশনে একটি দরকারী বৈশিষ্ট্য।


অবজেক্ট কনস্ট্রাক্টর

একটি তীর ফাংশন ইনস্ট্যান্ট করার চেষ্টা একটি ব্যতিক্রম ছুঁড়েছে:

var x = () => {};
new x(); // TypeError: x is not a constructor

তীর ফাংশনগুলির উপর ফাংশনগুলির একটি মূল সুবিধাটি হ'ল অবজেক্ট কনস্ট্রাক্টর হিসাবে দ্বিগুণ ফাংশন:

function Person(name) {
    this.name = name;
}

তবে কার্যত অভিন্ন 2 ইএস হারমোনি খসড়া শ্রেণির সংজ্ঞাটি প্রায় কমপ্যাক্ট:

class Person {
    constructor(name) {
        this.name = name;
    }
}

আমি প্রত্যাশা করি যে প্রাক্তন স্বরলিপি ব্যবহার শেষ পর্যন্ত নিরুৎসাহিত হবে। অবজেক্ট কনস্ট্রাক্টর নোটেশন এখনও কিছু দ্বারা সাধারণ বেনামে অবজেক্ট কারখানার জন্য ব্যবহার করা যেতে পারে যেখানে বস্তুগুলি প্রোগ্রামগতভাবে উত্পন্ন হয়, তবে অন্য অনেকের জন্য নয়।

যেখানে কোনও অবজেক্ট কনস্ট্রাক্টরের প্রয়োজন সেখানে ফাংশনটিকে classউপরের মত রূপান্তরিত করে বিবেচনা করা উচিত । বাক্য গঠন বেনাম ফাংশন / ক্লাসগুলির পাশাপাশি কাজ করে।


তীর ফাংশনগুলির পাঠযোগ্যতা

নিয়মিত ক্রিয়াকলাপগুলিতে আটকে থাকার সম্ভবত সবচেয়ে ভাল যুক্তি - স্কোপ সুরক্ষার ক্ষতি করা হবে - নিয়মিত ফাংশনগুলির চেয়ে তীর ফাংশনগুলি কম পঠনযোগ্য। যদি আপনার কোডটি প্রথম স্থানে কার্যকর না হয় তবে তীর ফাংশনগুলি প্রয়োজনীয় মনে হতে পারে না এবং যখন তীর ফাংশনগুলি ধারাবাহিকভাবে ব্যবহার করা হয় না তখন এগুলি কুরুচিপূর্ণ দেখায়।

এর নাম ECMAScript বেশ একটু পরিবর্তিত হয়েছে যেহেতু এর নাম ECMAScript 5.1 আমাদের কার্মিক দিলেন Array.forEach, Array.mapএবং আমাদের আছে এই কার্যকরী প্রোগ্রামিং সমস্ত বৈশিষ্ট্য ফাংশন যেখানে জন্য-লুপ পূর্বে ব্যবহৃত হত ব্যবহার করুন। অ্যাসিঙ্ক্রোনাস জাভাস্ক্রিপ্ট বেশ কিছুটা বন্ধ করে দিয়েছে। ES6 Promiseকোনও বস্তুকেও পাঠাবে , যার অর্থ আরও বেনাম ফাংশন। ফাংশনাল প্রোগ্রামিংয়ের জন্য আর ফিরে যাচ্ছে না। কার্যকরী জাভাস্ক্রিপ্টে, তীর ফাংশনগুলি নিয়মিত ফাংশনগুলির চেয়ে বেশি পছন্দনীয়।

উদাহরণস্বরূপ এই 3 কোডের (বিশেষত বিভ্রান্তিকর) নিন :

function CommentController(articles) {
    this.comments = [];

    articles.getList()
        .then(articles => Promise.all(articles.map(article => article.comments.getList())))
        .then(commentLists => commentLists.reduce((a, b) => a.concat(b)));
        .then(comments => {
            this.comments = comments;
        })
}

নিয়মিত ফাংশন সহ একই টুকরা কোড:

function CommentController(articles) {
    this.comments = [];

    articles.getList()
        .then(function (articles) {
            return Promise.all(articles.map(function (article) { 
                return article.comments.getList();
            }));
        })
        .then(function (commentLists) {
            return commentLists.reduce(function (a, b) {
                return a.concat(b); 
            });
        })
        .then(function (comments) {
            this.comments = comments;
        }.bind(this));
}

তীরের যে কোনও একটি ক্রিয়াকলাপ একটি স্ট্যান্ডার্ড ফাংশন দ্বারা প্রতিস্থাপন করা যেতে পারে, এটি করার ফলে খুব কম পাওয়া যাবে। কোন সংস্করণটি বেশি পঠনযোগ্য? আমি প্রথম বলতে হবে।

আমি মনে করি তীর ফাংশন বা নিয়মিত ফাংশন ব্যবহার করবেন কিনা তা প্রশ্ন সময়ের সাথে সাথে কম প্রাসঙ্গিক হয়ে উঠবে। বেশিরভাগ ফাংশন হয় শ্রেণিবদ্ধ পদ্ধতিতে পরিণত হবে, যা মূলশব্দটি বাদ দেয় function, বা তারা ক্লাসে পরিণত হয়। ফাংশনগুলি প্যাচিং ক্লাসগুলির মাধ্যমে ব্যবহৃত হবে Object.prototype। মাঝামাঝি সময়ে আমি functionকীওয়ার্ডটি এমন কোনও কিছুর জন্য সংরক্ষণ করার পরামর্শ দিচ্ছি যা সত্যই কোনও শ্রেণি পদ্ধতি বা শ্রেণি হওয়া উচিত।


মন্তব্য

  1. নামযুক্ত তীর ফাংশনগুলি ES6 স্পেসে পিছিয়ে দেওয়া হয়েছে । তাদের এখনও একটি ভবিষ্যতের সংস্করণ যুক্ত করা যেতে পারে।
  2. খসড়া স্পেসিফিকেশন অনুসারে "ক্লাস ডিক্লেয়ারেশন / এক্সপ্রেশনগুলি কনস্ট্রাক্টর ফাংশন / প্রোটোটাইপ পেয়ার তৈরি করে ফাংশন ঘোষণার জন্য ঠিক" যতক্ষণ না কোনও ক্লাস extendকীওয়ার্ড ব্যবহার করে না । একটি সামান্য পার্থক্য হ'ল শ্রেণীর ঘোষণাগুলি ধ্রুবক, তবে ফাংশন ঘোষণাগুলি হয় না।
  3. একক বিবৃতি তীরের ক্রিয়াকলাপগুলিতে ব্লকগুলিতে নোট করুন: আমি যেখানেই তীর ফাংশনটি একা পার্শ্ব প্রতিক্রিয়াটির জন্য ডাকা হয় সেখানে ব্লকটি ব্যবহার করতে চাই (যেমন অ্যাসাইনমেন্ট)। এইভাবে এটি স্পষ্ট যে রিটার্ন মান বাতিল করা যেতে পারে।

4
অন্য সময় আপনি ব্যবহার করতে চান functionযখন আপনি thisআবদ্ধ হতে চান না , তাই না? এর জন্য আমার সর্বাধিক সাধারণ পরিস্থিতি হল ইভেন্টগুলি, যেখানে আপনি thisইভেন্টটিকে (সাধারণত ডোম নোড) উল্লেখ করতে পারেন যা ইভেন্টটিকে ট্রিগার করে।
ব্রেট

13
আমি আসলে 3 হিসাবে উদাহরণস্বরূপ মনে করি, নিয়মিত ফাংশনগুলি আরও পঠনযোগ্য। এমনকি অ-প্রোগ্রামাররা যা ঘটছে তা divineশ্বরিক করতে পারে। তীরগুলির সাহায্যে, আপনাকে সেই উদাহরণটি বুঝতে কীভাবে কাজ করে তা অবশ্যই জানতে হবে। হয়তো আরও নতুনলাইনগুলি তীরের উদাহরণটিকে সহায়তা করবে, তবে আমি জানি না। কেবল আমার 2 সেন্ট কিন্তু তীরগুলি আমাকে ক্রিঞ্জ তৈরি করে (তবে আমি এখনও সেগুলি ব্যবহার করি নি, তাই আমি শীঘ্রই রূপান্তরিত হতে পারি))
স্পেনসার

3
@ স্পেনসার এটি একটি সুস্পষ্ট পয়েন্ট। আমার নিজের অভিজ্ঞতা থেকে, =>সময়ের সাথে আরও ভাল দেখায়। আমি সন্দেহ করি যে নন-প্রোগ্রামাররা দুটি উদাহরণ সম্পর্কে খুব আলাদাভাবে অনুভব করবে। আপনি যদি ES2016 কোডটি লিখছেন তবে আপনি সাধারণত এটির অনেকগুলি তীর ফাংশন ব্যবহার করে শেষ করতে যাচ্ছেন না। এই উদাহরণে, async / প্রতীক্ষা এবং একটি অ্যারে উপলব্ধি ব্যবহার করে, আপনি reduce()কলটিতে কেবল একটি তীর ফাংশন দিয়ে শেষ করবেন ।
lyschoening

3
স্পেনসারের সাথে আমি সম্পূর্ণরূপে একমত যে নিয়মিত ফাংশনগুলি উদাহরণে আরও বেশি পাঠযোগ্য।
jonschlinkert

2
ভাল উত্তর, thx! ব্যক্তিগতভাবে আমি যতটা সম্ভব বৈশ্বিক সুযোগে তীর ব্যবহার করি use এটি আমাকে প্রায় কোনও 'ফাংশন' ছাড়েনি। আমার কাছে কোডের একটি 'ফাংশন' এর অর্থ একটি বিশেষ কেস যা এর বাইরে থাকা এবং সাবধানে বিবেচনা করা দরকার।
কফিফাস

80

প্রস্তাব অনুসারে , তীরগুলি লক্ষ্য করে "প্রচলিত কয়েকটি সাধারণ ব্যথা পয়েন্টগুলিকে সম্বোধন করা এবং সমাধান করা Function Expression।" তারা উদ্দেশ্যমূলকভাবে বাঁধাই করে thisএবং সংশ্লেষের সিনট্যাক্স সরবরাহ করে বিষয়গুলির উন্নতি করতে চেয়েছিল ।

যাহোক,

  • thisএকটানা নিয়মিতভাবে বাঁধতে পারে না
  • তীর ফাংশন সিনট্যাক্স নাজুক এবং অস্পষ্ট

অতএব, তীর ফাংশনগুলি বিভ্রান্তি এবং ত্রুটির জন্য সুযোগ তৈরি করে এবং একটি জাভাস্ক্রিপ্ট প্রোগ্রামারের শব্দভাণ্ডার থেকে বাদ দেওয়া উচিত, functionএকচেটিয়াভাবে প্রতিস্থাপন ।

লেক্সিকাল সম্পর্কিত this

this সমস্যাযুক্ত:

function Book(settings) {
    this.settings = settings;
    this.pages = this.createPages();
}
Book.prototype.render = function () {
    this.pages.forEach(function (page) {
        page.draw(this.settings);
    }, this);
};

তীর ফাংশনগুলি যেখানে আমাদের thisকলব্যাকের অভ্যন্তরে কোনও সম্পত্তি অ্যাক্সেস করতে হবে সেখানে সমস্যাটি ঠিক করার উদ্দেশ্যে । এটি করার জন্য ইতিমধ্যে বেশ কয়েকটি উপায় রয়েছে: সমষ্টিগত পদ্ধতিতে 3 য় আর্গুমেন্ট ব্যবহারযোগ্য thisএকটি পরিবর্তনশীলকে ব্যবহার করতে পারে bindবা ব্যবহার করতে পারে Array। তবু তীরগুলি সহজতম কাজ বলে মনে হচ্ছে, সুতরাং পদ্ধতিটি এভাবে রিফ্যাক্ট করা যায়:

this.pages.forEach(page => page.draw(this.settings));

যাইহোক, বিবেচনা করুন যে কোডটি jQuery এর মতো একটি লাইব্রেরি ব্যবহার করেছে, যার পদ্ধতিগুলি thisবিশেষভাবে আবদ্ধ । এখন, এর thisসাথে মোকাবিলা করার জন্য দুটি মান রয়েছে:

Book.prototype.render = function () {
    var book = this;
    this.$pages.each(function (index) {
        var $page = $(this);
        book.draw(book.currentPage + index, $page);
    });
};

আমরা ব্যবহার করা আবশ্যক function, যাতে জন্য eachজুড়তে অনুমতি thisপরিবর্তনশীল। আমরা এখানে একটি তীর ফাংশন ব্যবহার করতে পারি না।

একাধিক thisমান নিয়ে কাজ করাও বিভ্রান্তিকর হতে পারে, কারণ thisকোন লেখক যার বিষয়ে কথা বলছিলেন তা জানা মুশকিল :

function Reader() {
    this.book.on('change', function () {
        this.reformat();
    });
}

লেখক আসলে ফোন করার ইচ্ছা করেছিল Book.prototype.reformat? বা সে বাঁধতে ভুলে গেছে this, এবং কল করার ইচ্ছা করেছিল Reader.prototype.reformat? যদি আমরা হ্যান্ডলারটিকে একটি তীর ফাংশনে পরিবর্তন করি তবে আমরা একইভাবে ভাবব যে লেখক গতিশীল চান কিনা this, তবুও একটি তীর বেছে নিয়েছেন কারণ এটি একটি লাইনে ফিট করে:

function Reader() {
    this.book.on('change', () => this.reformat());
}

একটি হতে পারে: "এটি কি ব্যতিক্রমী যে তীরগুলি ব্যবহার করার জন্য কখনও কখনও ভুল ফাংশন হতে পারে? সম্ভবত আমাদের যদি কেবলমাত্র গতিশীল thisমানগুলির প্রয়োজন হয় , তবে বেশিরভাগ সময় তীর ব্যবহার করা ঠিক হবে" "

তবে নিজেকে এটি জিজ্ঞাসা করুন: "কোডটি ডিবাগ করা কি কোনও 'মূল্যবান' কাজ এবং 'তীরের কেস' দ্বারা ত্রুটির ফলস্বরূপ আনা হয়েছে? '' আমি কেবল বেশিরভাগ সময়ই সমস্যা এড়াতে পছন্দ করি না, তবে 100% সময়।

আরও ভাল উপায় আছে: সর্বদা ব্যবহার করুন function(তাই thisসর্বদা গতিবদ্ধভাবে আবদ্ধ হতে পারে), এবং সর্বদা thisএকটি চলক মাধ্যমে রেফারেন্স । চলকগুলি বর্ণনামূলক এবং বহু নাম ধরে নেওয়া হয়। thisকোনও ভেরিয়েবলকে অর্পণ করা আপনার উদ্দেশ্যগুলি পরিষ্কার করে দেবে:

function Reader() {
    var reader = this;
    reader.book.on('change', function () {
        var book = this;
        book.reformat();
        reader.reformat();
    });
}

তদ্ব্যতীত, সবসময় বরাদ্দ thisএকটি পরিবর্তনশীল (এমনকি যখন সেখানে একটি একক thisঅথবা অন্য কোন ফাংশন) নিশ্চিত করে নিজের উদ্দেশ্য স্পষ্ট থাকা পরেও কোড পরিবর্তিত হয়।

এছাড়াও, গতিশীল thisখুব কমই ব্যতিক্রমী। jQuery 50 মিলিয়নেরও বেশি ওয়েবসাইটে (ফেব্রুয়ারী 2016 এ এই লেখা হিসাবে) ব্যবহৃত হয়। এখানে অন্যান্য এপিআইগুলি thisগতিশীলভাবে বাঁধাই করছে :

  • মোচা (গতকাল ~ 120 কে ডাউনলোড) এর মাধ্যমে এর পরীক্ষার জন্য পদ্ধতিগুলি প্রকাশ করে this
  • গ্রান্ট (গতকাল ~ 63 কে ডাউনলোড) এর মাধ্যমে বিল্ড টাস্কের পদ্ধতি প্রকাশ করে this
  • ব্যাকবোন (গতকাল 22 ডলার ডাউনলোড) অ্যাক্সেসের পদ্ধতিগুলি সংজ্ঞায়িত করে this
  • ইভেন্ট API গুলি (করে DOM এর মত) একটি পড়ুন EventTargetসঙ্গে this
  • প্রোটোটাইপাল এপিআইগুলি যা প্যাচযুক্ত বা প্রসারিত তার সাথে দৃষ্টান্তগুলি উল্লেখ করে this

( Http://trends.builtwith.com/javascript/jQuery এবং https://www.npmjs.com এর মাধ্যমে পরিসংখ্যান ))

আপনার সম্ভবত thisইতিমধ্যে গতিশীল বাইন্ডিংয়ের প্রয়োজন ।

একটি শব্দার্থক thisকখনও কখনও প্রত্যাশিত হয়, তবে কখনও কখনও হয় না; যেমন একটি গতিশীল thisকখনও কখনও আশা করা হয়, কিন্তু কখনও কখনও না। ধন্যবাদ, একটি আরও ভাল উপায় আছে, যা সর্বদা প্রত্যাশিত বাঁধাই উত্পাদন করে এবং যোগাযোগ করে।

টর্স সিনট্যাক্স সম্পর্কিত

তীর ফাংশনগুলি ফাংশনগুলির জন্য একটি "সংক্ষিপ্ত সিনট্যাকটিকাল ফর্ম" সরবরাহ করতে সফল হয়েছিল। তবে এই সংক্ষিপ্ত ফাংশনগুলি কি আপনাকে আরও সফল করে তুলবে?

Is x => x * x"সহজ পড়ার জন্য" চেয়ে function (x) { return x * x; }? সম্ভবত এটি হ'ল কারণ এটির একটি একক, সংক্ষিপ্ত কোডের কোড উত্পাদন করার সম্ভাবনা বেশি। ডাইসনের সাথে সামঞ্জস্য করা পর্দা থেকে পড়ার কার্যকারিতার উপর পড়ার গতি এবং রেখার দৈর্ঘ্যের প্রভাব ,

একটি মাঝারি লাইনের দৈর্ঘ্য (প্রতি লাইনে 55 টি অক্ষর) স্বাভাবিক এবং দ্রুত গতিতে কার্যকর পঠন সমর্থন করে appears এটি বোধের সর্বোচ্চ স্তরের উত্পাদন করেছে। । ।

কন্ডিশনাল (টেরিনারি) অপারেটর এবং একক-লাইন ifস্টেটমেন্টের জন্য অনুরূপ ন্যায়সঙ্গততা তৈরি করা হয় ।

তবে, আপনি কি প্রস্তাবটিতে বিজ্ঞাপন দেওয়া সাধারণ গাণিতিক কাজগুলি সত্যিই লিখছেন ? আমার ডোমেনগুলি গাণিতিক নয়, তাই আমার সাবরুটাইনগুলি খুব কমই মার্জিত হয়। পরিবর্তে, আমি সাধারণত তীরের ক্রিয়াকলাপগুলি কলামের সীমা ভেঙে দেখি এবং সম্পাদক বা স্টাইল গাইডের কারণে অন্য লাইনে আবৃত করি যা ডাইসনের সংজ্ঞা অনুসারে "পাঠযোগ্যতা" বাতিল করে দেয়।

কেউ বলতে পারে, "সম্ভব হলে সংক্ষিপ্ত ফাংশনগুলির জন্য সংক্ষিপ্ত সংস্করণটি কীভাবে ব্যবহার করা যায়?" তবে এখন একটি স্টাইলিস্টিক নিয়ম একটি ভাষার সীমাবদ্ধতার বিরোধিতা করে: "কখনও কখনও কেবলমাত্র দীর্ঘতম স্বরলিপি thisযেমন প্রত্যাশার সাথে আবদ্ধ হয় তা মনে রেখে, সংক্ষিপ্ততম ফাংশন স্বরলিপিটি ব্যবহার করার চেষ্টা করুন ।" এই ধরনের সংঘাত তীরগুলি বিশেষত ব্যবহারের প্রবণ করে তোলে।

তীর ফাংশন সিনট্যাক্স সহ অসংখ্য সমস্যা রয়েছে:

const a = x =>
    doSomething(x);

const b = x =>
    doSomething(x);
    doSomethingElse(x);

এই উভয় ফাংশন সিনথেটিকভাবে বৈধ। তবে doSomethingElse(x);এর শরীরে নয় b, এটি কেবলমাত্র দুর্বল-উদ্বিগ্ন, শীর্ষ-স্তরের বক্তব্য।

ব্লক ফর্মটিতে প্রসারিত করার সময়, আর কোনও অন্তর্নিহিত নেই return, যা পুনরুদ্ধার করতে ভুলে যেতে পারে। তবে এই অভিব্যক্তিটি কেবলমাত্র একটি পার্শ্ব-প্রতিক্রিয়া তৈরির উদ্দেশ্যেই করা হয়েছিল, সুতরাং কে জানে যে কোনও স্পষ্টতই returnএগিয়ে যাওয়ার প্রয়োজন হবে কিনা?

const create = () => User.create();

const create = () => {
    let user;
    User.create().then(result => {
        user = result;
        return sendEmail();
    }).then(() => user);
};

const create = () => {
    let user;
    return User.create().then(result => {
        user = result;
        return sendEmail();
    }).then(() => user);
};

বিশ্রামের প্যারামিটার হিসাবে চিহ্নিত করা যেতে পারে তা স্প্রেড অপারেটর হিসাবে পার্স করা যায়:

processData(data, ...results => {}) // Spread
processData(data, (...results) => {}) // Rest

অ্যাসাইনমেন্টটি ডিফল্ট যুক্তিগুলির সাথে বিভ্রান্ত হতে পারে:

const a = 1;
let x;
const b = x => {}; // No default
const b = x = a => {}; // "Adding a default" instead creates a double assignment
const b = (x = a) => {}; // Remember to add parens

ব্লকগুলি বস্তুর মতো দেখতে:

(id) => id // Returns `id`
(id) => {name: id} // Returns `undefined` (it's a labeled statement)
(id) => ({name: id}) // Returns an object

এটার মানে কি?

() => {}

লেখক কি কোনও অনিঃপশন তৈরি করার পরিকল্পনা করেছেন, বা এমন কোনও ফাংশন যা একটি খালি অবজেক্ট ফেরত দেয়? (এটি মাথায় রেখে, আমাদের কি কখনও এই {পরে রাখা উচিত =>? আমরা কি কেবলমাত্র বাক্য বাক্য গঠনকে সীমাবদ্ধ রাখতে পারি? এটি তীরের ফ্রিকোয়েন্সি আরও কমিয়ে দেবে))

=>দেখতে দেখতে <=এবং >=:

x => 1 ? 2 : 3
x <= 1 ? 2 : 3

if (x => 1) {}
if (x >= 1) {}

তাত্ক্ষণিকভাবে একটি তীর ফাংশন এক্সপ্রেশন শুরু করতে, একটি অবশ্যই ()বাহিরে রাখা উচিত , তবুও ()ভিতরে থাকা বৈধ এবং উদ্দেশ্যমূলক হতে পারে।

(() => doSomething()()) // Creates function calling value of `doSomething()`
(() => doSomething())() // Calls the arrow function

যদিও, যদি কেউ (() => doSomething()());তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন লেখার অভিপ্রায় নিয়ে লিখেন, তবে কিছুই হবে না।

উপরোক্ত সমস্ত ক্ষেত্রে মাথায় রেখে তীর ফাংশনগুলি "আরও বোধগম্য" তর্ক করা শক্ত hard এক পারে এই সিনট্যাক্স ব্যবহার করা প্রয়োজন সব বিশেষ নিয়ম শিখতে। এটা কি আসলেই এর যোগ্য?

এর সিনট্যাক্সটি functionনিঃসন্দেহে সাধারণীকরণ করা হয়। functionএকচেটিয়াভাবে ব্যবহার করার অর্থ ভাষাটি নিজেই একটি বিভ্রান্তিকর কোড লিখতে বাধা দেয়। সমস্ত ক্ষেত্রে সিনথেটিকভাবে বোঝা উচিত এমন প্রক্রিয়াগুলি লিখতে, আমি চয়ন করি function

একটি গাইডলাইন সম্পর্কে

আপনি এমন একটি গাইডলাইন অনুরোধ করেছেন যা "পরিষ্কার" এবং "ধারাবাহিক" হওয়া দরকার। তীর ফাংশনগুলি ব্যবহারের ফলে পরিণামে সিনথেটিক্যালি-বৈধ, যৌক্তিকভাবে-অবৈধ কোড হবে, উভয় ফাংশনই একত্রে জড়িত, অর্থপূর্ণ এবং নির্বিচারে। অতএব, আমি নিম্নলিখিত অফার:

ES6 এ ফাংশন স্বরলিপির জন্য গাইডলাইন:

  • সর্বদা সঙ্গে পদ্ধতি তৈরি করুন function
  • সর্বদা thisএকটি পরিবর্তনশীল বরাদ্দ করুন । ব্যবহার করবেন না () => {}

5
আকর্ষণীয় জাভাস্ক্রিপ্টে একটি কার্যকরী প্রোগ্রামার এর ভিউ লিখুন। আমি নিশ্চিত না যে আমি ব্যক্তিগত ভেরিয়েবল যুক্তির সাথে একমত। IMO অল্প কিছু লোকের সত্যই তাদের প্রয়োজন হয়; যারা করেন তাদের সম্ভবত অন্যান্য চুক্তি বৈশিষ্ট্যগুলিরও প্রয়োজন হবে এবং যেভাবেই টাইপস্ক্রিপ্টের মতো একটি ভাষা বর্ধনের জন্য যেতে পারেন। আমি অবশ্যই এর selfপরিবর্তে এর আবেদন দেখতে পাচ্ছি । আপনার উল্লিখিত তীর ফাংশন সংক্রান্ত সমস্যাগুলিও সমস্ত বৈধ, এবং অন্যান্য বিবৃতিগুলির মতো একই মানগুলি ব্রেস ছাড়াই যেতে পারে এখানে অবশ্যই প্রয়োগ হয়; অন্যথায়, আমি মনে করি আপনার যুক্তি দিয়ে একজন সর্বত্র সর্বত্র তীরের কার্যকারিতা সমর্থন করতে পারে।
লাইচচেনিং

7
"একাধিক উপায়ে কাজ করার ফলে কর্মক্ষেত্র এবং ভাষা সম্প্রদায়ের মধ্যে তর্ক এবং মতবিরোধের জন্য অপ্রয়োজনীয় ভেক্টর তৈরি হয় language ভাষা ব্যাকরণ আমাদেরকে খারাপ পছন্দ করতে না দিলে ভাল হয়" " একমত তাই। ভাল লেখা! আমি মনে করি তীর ফাংশনগুলি আসলে এক ধাপ পিছনে। অন্য কোনও বিষয়ে, আমি আশা করি আমার সহকর্মীরা .প্রোটোটাইপ সংজ্ঞা দিয়ে সিরিজ দিয়ে জাভাস্ক্রিপ্টটিকে সি # তে পরিণত করার চেষ্টা বন্ধ করে দেবেন। বিরক্তিকর. আমার বেনামে আপনার পোস্টটি লিঙ্ক করা উচিত :)
স্পেনসার

11
খুব ভাল লেখা! যদিও আমি আপনার বেশিরভাগ পয়েন্টের সাথে একমত নই, বিপরীত দৃষ্টিভঙ্গিটি বিবেচনা করা জরুরী।
খনি 2

4
তীর ফাংশন নয় তবে এর অদ্ভুত আচরণটি thisজাভাস্ক্রিপ্টের সমস্যা। সুস্পষ্টভাবে আবদ্ধ হওয়ার পরিবর্তে thisসুস্পষ্ট যুক্তি হিসাবে পাস করা উচিত।
বব

5
" সর্বদা ফাংশন ব্যবহার করুন (যাতে এটি সর্বদা গতিবদ্ধভাবে আবদ্ধ হতে পারে), এবং সর্বদা এটি একটি ভেরিয়েবলের মাধ্যমে উল্লেখ করুন। " আমি আরও দ্বিমত করতে পারি না!

48

কীওয়ার্ডটিকে আরও সহজ করে ফাংশনটি সহজ করার জন্য scopeএবং সমাধান করার জন্য তীর ফাংশন তৈরি করা হয়েছিল this। তারা =>সিনট্যাক্সটি ব্যবহার করে যা দেখতে তীরের মতো লাগে।

দ্রষ্টব্য: এটি বিদ্যমান ফাংশনগুলিকে প্রতিস্থাপন করে না। আপনি যদি তীর ফাংশনগুলির সাথে প্রতিটি ফাংশন সিনট্যাক্স প্রতিস্থাপন করেন তবে এটি সব ক্ষেত্রে কার্যকর হবে না।

চলুন বিদ্যমান ES5 সিনট্যাক্সটি একবার দেখে নেওয়া যাক, thisকীওয়ার্ডটি যদি কোনও অবজেক্টের পদ্ধতির (কোনও ফাংশন যা কোনও অবজেক্টের অন্তর্ভুক্ত) ভিতরে থাকে তবে এটি কী বোঝায়?

var Actor = {
  name: 'RajiniKanth',
  getName: function() {
     console.log(this.name);
  }
};
Actor.getName();

উপরের স্নিপেট একটি উল্লেখ objectকরে নাম মুদ্রণ করবে "RajiniKanth"। আসুন নীচের স্নিপেটটি অন্বেষণ করুন এবং দেখুন এখানে এটি কী নির্দেশ করবে।

var Actor = {
  name: 'RajiniKanth',
  movies: ['Kabali', 'Sivaji', 'Baba'],
  showMovies: function() {
   this.movies.forEach(function(movie) {
     alert(this.name + " has acted in " + movie);
   });
  }
};

Actor.showMovies();

এখন thisকীওয়ার্ডটি ভিতরে থাকলে method’s functionকী হবে?

এখানে এটি এর window objectচেয়ে কম হওয়া inner functionহিসাবে উল্লেখ করবে scope। কারণ this, সর্বদা এই ক্ষেত্রে যে ফাংশনটি রয়েছে তার মালিককে উল্লেখ করে - যেহেতু এটি এখন সুযোগের বাইরে - উইন্ডো / গ্লোবাল অবজেক্ট।

এটি যখন কোনও কোনও objectপদ্ধতির অভ্যন্তরে থাকে - তখন functionএর মালিক হ'ল অবজেক্ট। সুতরাং এই কীওয়ার্ডটি অবজেক্টের সাথে আবদ্ধ। তবুও যখন এটি কোনও ফাংশনের অভ্যন্তরে থাকে হয় হয় একা দাঁড়িয়ে থাকে বা অন্য কোনও পদ্ধতির মধ্যে থাকে, এটি সর্বদা window/globalঅবজেক্টটিকে বোঝায় ।

var fn = function(){
  alert(this);
}

fn(); // [object Window]

আমাদের ES5নিজের মধ্যে এই সমস্যাটি সমাধান করার উপায় রয়েছে , আসুন কীভাবে এটি সমাধান করা যায় সে সম্পর্কে ES6 তীরের ফাংশনগুলিতে ডাইভিংয়ের আগে তার দিকে নজর দেওয়া যাক।

সাধারণত আপনি, পদ্ধতির অভ্যন্তরীণ ফাংশনের বাইরে একটি পরিবর্তনশীল তৈরি করতে চান। এখন ‘forEach’পদ্ধতি লাভ অ্যাক্সেস thisএবং এইভাবে object’sবৈশিষ্ট্য এবং তাদের মান।

var Actor = {
  name: 'RajiniKanth',
  movies: ['Kabali', 'Sivaji', 'Baba'],
  showMovies: function() {
   var _this = this;
   this.movies.forEach(function(movie) {
     alert(_this.name + " has acted in " + movie);
   });
  }
};

Actor.showMovies();

কীওয়ার্ডটি bindসংযুক্ত করতে ব্যবহার করে thisযা পদ্ধতিতে উল্লেখ করে method’s inner function

var Actor = {
  name: 'RajiniKanth',
  movies: ['Kabali', 'Sivaji', 'Baba'],
  showMovies: function() {
   this.movies.forEach(function(movie) {
     alert(this.name + " has acted in " + movie);
   }.bind(this));
  }
};

Actor.showMovies();

এখন ES6তীর ফাংশন সহ, আমরা lexical scopingইস্যুটিকে সহজ উপায়ে মোকাবেলা করতে পারি ।

var Actor = {
  name: 'RajiniKanth',
  movies: ['Kabali', 'Sivaji', 'Baba'],
  showMovies: function() {
   this.movies.forEach((movie) => {
     alert(this.name + " has acted in " + movie);
   });
  }
};

Actor.showMovies();

Arrow functionsআরও বেশি ফাংশন স্টেটমেন্টের মতো এটি বাদে তারা bindএটি করে parent scope। যদি arrow function is in top scope, thisআর্গুমেন্টটি উল্লেখ করা হয় window/global scope, যখন একটি নিয়মিত ফাংশনের অভ্যন্তরে একটি তীর ফাংশনটিতে তার এই আর্গুমেন্টটি তার বাহ্যিক ফাংশনটির সমান হয়।

arrowক্রিয়াকলাপগুলি তৈরির সময় thisঘেরের সাথে আবদ্ধ scopeএবং পরিবর্তন করা যায় না। নতুন অপারেটর, বাঁধুন, কল করুন এবং প্রয়োগ করুন এর কোনও প্রভাব নেই।

var asyncFunction = (param, callback) => {
  window.setTimeout(() => {
  callback(param);
  }, 1);
};

// With a traditional function if we don't control
// the context then can we lose control of `this`.
var o = {
  doSomething: function () {
  // Here we pass `o` into the async function,
  // expecting it back as `param`
  asyncFunction(o, function (param) {
  // We made a mistake of thinking `this` is
  // the instance of `o`.
  console.log('param === this?', param === this);
  });
  }
};

o.doSomething(); // param === this? false

উপরের উদাহরণে আমরা এর নিয়ন্ত্রণ হারিয়ে ফেলেছি। আমরা পরিবর্তনশীল রেফারেন্স thisব্যবহার করে বা ব্যবহার করে উপরের উদাহরণটি সমাধান করতে পারি bind। ES6 এর সাহায্যে এটি thisএর আবদ্ধ হিসাবে পরিচালনা করা সহজ হয়ে যায় lexical scoping

var asyncFunction = (param, callback) => {
  window.setTimeout(() => {
  callback(param);
  }, 1);
};

var o = {
  doSomething: function () {
  // Here we pass `o` into the async function,
  // expecting it back as `param`.
  //
  // Because this arrow function is created within
  // the scope of `doSomething` it is bound to this
  // lexical scope.
  asyncFunction(o, (param) => {
  console.log('param === this?', param === this);
  });
  }
};

o.doSomething(); // param === this? true

যখন তীর ফাংশন না

আক্ষরিক একটি বস্তুর ভিতরে।

var Actor = {
  name: 'RajiniKanth',
  movies: ['Kabali', 'Sivaji', 'Baba'],
  getName: () => {
     alert(this.name);
  }
};

Actor.getName();

Actor.getNameএকটি তীর ফাংশন সংজ্ঞায়িত করা হয়, কিন্তু আবাহন তে এটি কারণ undefined সতর্কতা this.nameহয় undefinedযেমন প্রেক্ষাপটে অবশেষ window

এটি ঘটে কারণ তীর ফাংশন প্রসঙ্গটি প্রাসঙ্গিকভাবে window object... অর্থাৎ বাইরের স্কোপের সাথে আবদ্ধ করে । এক্সিকিউটিভ this.nameসমান window.name, যা নির্ধারিত।

প্রোটোটাইপ অবজেক্ট

একটিতে পদ্ধতি সংজ্ঞায়িত করার সময় একই নিয়ম প্রযোজ্য prototype object। CETName পদ্ধতিটি সংজ্ঞায়িত করার জন্য একটি তীর ফাংশন ব্যবহার করার পরিবর্তে, যা একটি ভুল এনেছে context window:

function Actor(name) {
  this.name = name;
}
Actor.prototype.getName = () => {
  console.log(this === window); // => true
  return this.name;
};
var act = new Actor('RajiniKanth');
act.getName(); // => undefined

নির্মাণকারীদের চালু করা হচ্ছে

thisএকটি নির্মাণ অনুরোধে সদ্য নির্মিত বস্তু হয়। যখন নতুন ফাং নির্বাহ (), প্রেক্ষাপটে constructor Fnএকটি নতুন বস্তু হল: this instanceof Fn === true

this এনকোলেজিং প্রসঙ্গ থেকে সেটআপ করা হয়, অর্থাৎ বাইরের স্কোপ যা এটি নতুনভাবে তৈরি করা অবজেক্টকে নির্ধারিত করে না।

var Message = (text) => {
  this.text = text;
};
// Throws "TypeError: Message is not a constructor"
var helloMessage = new Message('Hello World!');

গতিশীল প্রসঙ্গে কলব্যাক

তীর ফাংশনটি contextঘোষণার উপর স্থিরভাবে আবদ্ধ করে এবং এটি গতিশীল করা সম্ভব হয় না। DOM উপাদানগুলিতে ইভেন্ট শ্রোতাদের সংযুক্তি ক্লায়েন্ট সাইড প্রোগ্রামিংয়ের একটি সাধারণ কাজ। একটি ইভেন্ট হ্যান্ডলার ফাংশনটিকে লক্ষ্য উপাদান হিসাবে এটি ট্রিগার করে।

var button = document.getElementById('myButton');
button.addEventListener('click', () => {
  console.log(this === window); // => true
  this.innerHTML = 'Clicked button';
});

thisএকটি তীর ফাংশনে উইন্ডো যা বৈশ্বিক প্রসঙ্গে সংজ্ঞায়িত করা হয়। যখন একটি ক্লিক ইভেন্ট হয়, ব্রাউজার বোতামের প্রসঙ্গে হ্যান্ডলার ফাংশনটি আহ্বান করার চেষ্টা করে, তবে তীর ফাংশনটি তার পূর্বনির্ধারিত প্রসঙ্গে পরিবর্তন করে না। this.innerHTMLএর সমতুল্য window.innerHTMLএবং এর কোনও বুদ্ধি নেই।

আপনাকে একটি ফাংশন এক্সপ্রেশন প্রয়োগ করতে হবে, যা লক্ষ্য উপাদানের উপর নির্ভর করে এটি পরিবর্তন করতে দেয়:

var button = document.getElementById('myButton');
button.addEventListener('click', function() {
  console.log(this === button); // => true
  this.innerHTML = 'Clicked button';
});

যখন ব্যবহারকারী বোতামটি ক্লিক করেন, হ্যান্ডলারের ফাংশনে এটি বোতামটি হয়। এইভাবে this.innerHTML = 'Clicked button'ক্লিক করা স্থিতি প্রতিফলিত করতে বোতামের পাঠ্যটি সঠিকভাবে সংশোধন করে।

তথ্যসূত্র: https://dmitripavlutin.com/when-not-to-use-arrow-function-in-javascript/


ঠিক আছে, আমি অবশ্যই স্বীকার করতে পারি, "মাঝখানে সেরা মিথ্যা" । বিবৃতি দেওয়ার জন্য উত্সাহিত, যে তীর ফাংশনগুলি কোনও কার্যকরী ব্যবহারের ক্ষেত্রে কভার করবে না। এগুলি সত্যই সাধারণ সমস্যার একটি অংশ সমাধান করার জন্য তৈরি করা হয়েছে। কেবল তাদের পুরোপুরি স্যুইচ করা একটি ওভারকিল হবে।
ব্লিটজেড

@ দিমিত্রি পাভলুটিন: আমার আপডেট হওয়া পোস্টটি দেখুন, এটি প্রচুর পরিমাণে সংগ্রহ ... এটি হতে পারে আমার কোনও রেফারেন্স পোস্ট করা উচিত।
থ্যালাইভর

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

একটিতে using bind to attach the this keyword that refers to the method to the method’s inner function.সিনট্যাক্স ত্রুটি রয়েছে।
চোদা চ্যাং

হওয়া উচিতvar Actor = { name: 'RajiniKanth', movies: ['Kabali', 'Sivaji', 'Baba'], showMovies: function() { this.movies.forEach(function(movie){ alert(this.name + ' has acted in ' + movie); }.bind(this)) } }; Actor.showMovies();
কোদা চ্যাং

14

তীর ফাংশন - এখন পর্যন্ত সর্বাধিক ব্যবহৃত ES6 বৈশিষ্ট্য ...

ব্যবহার: সমস্ত ES5 ফাংশনগুলি ES6 তীর ফাংশনগুলির সাথে নিম্নলিখিত পরিস্থিতিতে ব্যতীত প্রতিস্থাপন করা উচিত:

তীর ফাংশন ব্যবহার করা উচিত নয়:

  1. আমরা যখন ফাংশন উত্তোলন চাই
    • তীর ফাংশন হিসাবে বেনামে।
  2. যখন আমরা কোনও ফাংশনে this/ ব্যবহার করতে চাইarguments
    • যেমন তীর ফাংশনগুলির নিজস্ব this/ argumentsনেই, তারা তাদের বাহ্যিক প্রসঙ্গে নির্ভর করে।
  3. আমরা যখন নামকৃত ফাংশনটি ব্যবহার করতে চাই
    • তীর ফাংশন হিসাবে বেনামে।
  4. আমরা যখন একটি হিসাবে ফাংশন ব্যবহার করতে চান constructor
    • তীর ফাংশনগুলির নিজস্ব নেই this
  5. আমরা যখন বস্তুর আক্ষরিক হিসাবে সম্পত্তি হিসাবে ফাংশন যুক্ত করতে চাই এবং এতে বস্তুটি ব্যবহার করি
    • যেহেতু আমরা অ্যাক্সেস করতে পারি না this(যা নিজেই আপত্তি করা উচিত)।

আসুন আরও ভালভাবে বুঝতে তীর ফাংশনগুলির কয়েকটি রূপ বুঝতে পারি:

ভেরিয়েন্ট 1 : যখন আমরা কোনও ফাংশনে একাধিক যুক্তি পাস করতে চাই এবং এটি থেকে কিছু মান ফেরত দিতে চাই।

ES5 সংস্করণ :

var multiply = function (a,b) {
    return a*b;
};
console.log(multiply(5,6)); //30

ES6 সংস্করণ :

var multiplyArrow = (a,b) => a*b;
console.log(multiplyArrow(5,6)); //30

দ্রষ্টব্য: functionকীওয়ার্ডের প্রয়োজন নেই। =>দরকার. {}optionচ্ছিক, যখন আমরা সরবরাহ করি না তখন {} returnস্পষ্টভাবে জাভাস্ক্রিপ্ট দ্বারা যুক্ত করা হয় এবং যখন আমরা সরবরাহ করি তখন {}আমাদের প্রয়োজন returnহলে এটি যুক্ত করতে হবে।

ভেরিয়েন্ট ২ : যখন আমরা কোনও ফাংশনে কেবলমাত্র একটি যুক্তি পাস করতে চাই এবং এটি থেকে কিছু মান ফিরিয়ে দিতে চাই।

ES5 সংস্করণ :

var double = function(a) {
    return a*2;
};
console.log(double(2)); //4

ES6 সংস্করণ :

var doubleArrow  = a => a*2;
console.log(doubleArrow(2)); //4

দ্রষ্টব্য: কেবলমাত্র একটি যুক্তি পাস করার সময় আমরা প্রথম বন্ধনী বাদ দিতে পারি ()

বৈকল্পিক 3 : যখন আমরা কোনও ফাংশনে কোনও যুক্তি পাস করতে চাই না এবং কোনও মান ফেরত দিতে চাই না।

ES5 সংস্করণ :

var sayHello = function() {
    console.log("Hello");
};
sayHello(); //Hello

ES6 সংস্করণ :

var sayHelloArrow = () => {console.log("sayHelloArrow");}
sayHelloArrow(); //sayHelloArrow

ভেরিয়েন্ট ৪ : যখন আমরা স্পষ্টভাবে তীর ফাংশন থেকে ফিরে আসতে চাই।

ES6 সংস্করণ :

var increment = x => {
  return x + 1;
};
console.log(increment(1)); //2

ভেরিয়েন্ট 5 : যখন আমরা তীর ফাংশন থেকে কোনও বস্তুটি ফিরিয়ে দিতে চাই।

ES6 সংস্করণ :

var returnObject = () => ({a:5});
console.log(returnObject());

দ্রষ্টব্য: আমাদের অবজেক্টটিকে প্রথম বন্ধনে ()আবদ্ধ করতে হবে অন্যথায় জাভাস্ক্রিপ্ট কোনও ব্লক এবং কোনও অবজেক্টের মধ্যে পার্থক্য করতে পারে না।

বৈকল্পিক 6 : তীর ফাংশনগুলির argumentsনিজস্ব কোনও (বস্তুর মতো একটি অ্যারে) থাকে না যার জন্য তারা বাইরের প্রসঙ্গের উপর নির্ভর করে arguments

ES6 সংস্করণ :

function foo() {
  var abc = i => arguments[0];
  console.log(abc(1));
};    
foo(2); // 2

নোট: fooএকটি সঙ্গে, একটি ES5 ফাংশন argumentsএটা করতে বস্তুর মতো বিন্যাস এবং একটি আর্গুমেন্ট পাস 2তাই arguments[0]জন্য foo2।

abcএকটি ES6 তীর ফাংশন নেই যেহেতু এটি নিজস্ব থাকে নয় argumentsঅত: পর এটা ছাপে arguments[0]এর fooএটা বাইরের প্রসঙ্গ পরিবর্তে।

বৈকল্পিক 7 : তীর ফাংশনগুলির thisনিজস্ব নিজস্ব থাকে না যার জন্য তারা বাইরের প্রসঙ্গের উপর নির্ভর করেthis

ES5 সংস্করণ :

var obj5 = {
  greet: "Hi, Welcome ",
  greetUser : function(user) {
        setTimeout(function(){
        console.log(this.greet + ": " +  user); // "this" here is undefined.
        });
     }
};

obj5.greetUser("Katty"); //undefined: Katty

দ্রষ্টব্য: সেটটাইমআউটে পাঠানো কলব্যাক একটি ES5 ফাংশন এবং এটির নিজস্ব রয়েছে thisযা use-strictপরিবেশে অপরিজ্ঞাত তাই আমরা আউটপুট পাই:

undefined: Katty

ES6 সংস্করণ :

var obj6 = {
  greet: "Hi, Welcome ",
  greetUser : function(user) {
    setTimeout(() => console.log(this.greet + ": " +  user)); 
      // this here refers to outer context
   }
};

obj6.greetUser("Katty"); //Hi, Welcome: Katty

নোট: কলব্যাক প্রেরণ setTimeoutএকটি ES6 হয় তীর ফাংশন এবং এটা নিজের ব্যাপার নেই thisতাই এটি এটা লাগে এটা বাইরের প্রসঙ্গ যে এর থেকে greetUserযা thisহয় obj6অত: পর আমরা আউটপুট পাবেন:

Hi, Welcome: Katty

বিবিধ: আমরা newতীর ফাংশন ব্যবহার করতে পারি না । তীর ফাংশনগুলির prototypeসম্পত্তি নেই। thisতীর ফাংশনটি কখন applyবা মাধ্যমে প্রেরণ করা হবে তা আমাদের কাছে কোন বাধ্যবাধকতা নেই call


6

এখনও অবধি দুর্দান্ত উত্তরের পাশাপাশি, আমি একটি খুব আলাদা কারণ উপস্থাপন করতে চাই কেন তীর ফাংশনগুলি একটি নির্দিষ্ট অর্থে "সাধারণ" জাভাস্ক্রিপ্ট ফাংশনগুলির চেয়ে মৌলিকভাবে ভাল। আলোচনার স্বার্থে, আসুন আমরা সাময়িকভাবে ধরে নিই আমরা টাইপস্ক্রিপ্ট বা ফেসবুকের "ফ্লো" এর মতো টাইপ চেকার ব্যবহার করি। নিম্নলিখিত খেলনা মডিউলটি বিবেচনা করুন, যা বৈধ ECMAScript code কোড প্লাস ফ্লো টাইপ টিকা::

export class C {
  n : number;
  f1: number => number; 
  f2: number => number;

  constructor(){
    this.n = 42;
    this.f1 = (x:number) => x + this.n;
    this.f2 = function (x:number) { return  x + this.n;};
  }
}

এখন দেখুন যখন আমরা বিভিন্ন মডিউল থেকে C শ্রেণি ব্যবহার করি, তখন কী হয়:

let o = { f1: new C().f1, f2: new C().f2, n: "foo" };
let n1: number = o.f1(1); // n1 = 43
console.log(n1 === 43); // true
let n2: number = o.f2(1); // n2 = "1foo"
console.log(n2 === "1foo"); // true, not a string!

আপনি দেখতে পাচ্ছেন, টাইপ চেকারটি এখানে ব্যর্থ হয়েছে: f2 একটি নম্বর ফেরত দেওয়ার কথা ছিল, তবে এটি একটি স্ট্রিং ফিরিয়েছিল!

সবচেয়ে খারাপ এটি মনে হয় যে কোনও অনুমেয় প্রকারের চেকার সাধারণ (তীরবিহীন) জাভাস্ক্রিপ্ট ফাংশনগুলি পরিচালনা করতে পারে না, কারণ f2 এর "এই" টি F2 এর আর্গুমেন্ট তালিকায় উপস্থিত হয় না, সুতরাং "এটি" এর জন্য প্রয়োজনীয় প্রকারটি সম্ভবত যুক্ত করা যায়নি এফ 2 এ টিকা হিসাবে।

টাইপ চেকার ব্যবহার না করে এমন সমস্যাগুলিকেও কী এই সমস্যাটি প্রভাবিত করে? আমারও তাই মনে হয়, কারণ আমাদের কোনও স্থির ধরণের না থাকলেও আমরা মনে করি তারা সেখানে আছে। ("প্রথম প্যারামিটারগুলির একটি সংখ্যা অবশ্যই হবে, দ্বিতীয়টি একটি স্ট্রিং" ইত্যাদি A) একটি লুকানো "এই" -যুগল যা ফাংশনের শরীরে ব্যবহার করা বা নাও হতে পারে তা আমাদের মানসিক বুকিংকে আরও শক্ত করে তোলে।

এটি চলমানযোগ্য টাইপযুক্ত সংস্করণ, যা বাবেল দ্বারা উত্পাদিত হবে:

class C {
    constructor() {
        this.n = 42;
        this.f1 = x => x + this.n;
        this.f2 = function (x) { return x + this.n; };
    }
}

let o = { f1: new C().f1, f2: new C().f2, n: "foo" };
let n1 = o.f1(1); // n1 = 43
console.log(n1 === 43); // true
let n2 = o.f2(1); // n2 = "1foo"
console.log(n2 === "1foo"); // true, not a string!



3

আমি এখনও এই থ্রেডে আমার প্রথম উত্তরে যা লিখেছি তার পাশে দাঁড়িয়ে আছি । তবে কোড শৈলীতে আমার মতামত তখন থেকেই বিকাশ লাভ করেছে, সুতরাং আমার এই প্রশ্নটির একটি নতুন উত্তর আছে যা আমার শেষটির উপর ভিত্তি করে তৈরি করে।

লেক্সিকাল সম্পর্কিত this

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

আমার বিশ্বাস এটি হ'ল: আমাদের thisপ্রথম স্থানে ব্যবহার করা উচিত নয় । সুতরাং, যদি কোনও ব্যক্তি ইচ্ছাকৃতভাবে thisতার কোডটি ব্যবহার করা এড়িয়ে চলে , তবে thisতীরগুলির "লেজিকাল " বৈশিষ্ট্যটির কোনও মূল্য নেই। এছাড়াও, thisখারাপ দিক হিসাবে ভিত্তিতে , তীরের চিকিত্সা thisকোনও "ভাল জিনিস" এর চেয়ে কম হয়; পরিবর্তে, এটি অন্য একটি খারাপ ভাষা বৈশিষ্ট্যের জন্য ক্ষতি নিয়ন্ত্রণের ফর্ম।

আমি অনুমান করেছি যে এটি কিছু লোকের মধ্যে ঘটে না, তবে এমনকি যাদের কাছে এটি হয় তাদেরও অবশ্যই তাদের অবশ্যই কোডবেসের মধ্যে অবশ্যই কাজ করতে হবে যেখানে thisফাইল প্রতি একশবার প্রদর্শিত হবে এবং ক্ষয়ক্ষতি নিয়ন্ত্রণের কিছুটা (বা অনেক) একটি যুক্তিসঙ্গত ব্যক্তি আশা করতে পারে। সুতরাং তীরগুলি ভাল হতে পারে, একরকমভাবে, যখন তারা খারাপ পরিস্থিতি আরও ভাল করে তোলে।

এমনকি thisতীরগুলি সহ কোড লেখা সহজ ছাড়াও, তীরগুলি ব্যবহারের নিয়মগুলি খুব জটিল থেকে যায় (দেখুন: বর্তমান থ্রেড)। সুতরাং, আপনার অনুরোধ অনুসারে নির্দেশিকা "পরিষ্কার" বা "সামঞ্জস্যপূর্ণ" নয় are এমনকি প্রোগ্রামাররা তীরের অস্পষ্টতা সম্পর্কে জেনে থাকলেও আমি মনে করি যে তারা যে কোনও উপায়ে তা সঙ্কুচিত করে এবং গ্রহণ করে, কারণ লেকসের মান thisতাদেরকে ছাপিয়ে যায়।

এগুলি সমস্ত নিম্নোক্ত অনুধাবনের একটি উপস্থাপনা: যদি কেউ এটি ব্যবহার না করে thisতবে thisসাধারণভাবে সেই তীরগুলি সম্পর্কে অস্পষ্টতা অপ্রাসঙ্গিক হয়ে যায়। এই প্রসঙ্গে তীরগুলি আরও নিরপেক্ষ হয়ে ওঠে।

টর্স সিনট্যাক্স সম্পর্কিত

যখন আমি আমার প্রথম উত্তরটি লিখেছিলাম, আমি এই মতামত দিয়েছিলাম যে সর্বোত্তম অনুশীলনের সাথেও অনর্থক আনুগত্যের অর্থ প্রদানের উপযুক্ত মূল্য ছিল যদি এর অর্থ হয় যে আমি আরও নিখুঁত কোড তৈরি করতে পারি। তবে অবশেষে আমি বুঝতে পেরেছিলাম যে বেদমতা বিমূর্ততার এমন এক রূপ হিসাবে পরিবেশন করতে পারে যা কোডের মানকেও উন্নত করতে পারে - কখনও কখনও সেরা অভ্যাস থেকে বিপথগামী হওয়ার ন্যায্যতার পক্ষে যথেষ্ট।

অন্য কথায়: অভিশাপ, আমি ওয়ান-লাইনার ফাংশনও চাই!

একটি গাইডলাইন সম্পর্কে

thisঅ্যান্ট্রাল তীর ফাংশন, এবং নিখরচায় মূল্য অনুধাবন করার সম্ভাবনা সহ , আমি নিম্নলিখিত আরও লেনিয়েন্ট গাইডলাইনটি অফার করছি:

ES6 এ ফাংশন স্বরলিপির জন্য গাইডলাইন:

  • ব্যবহার করবেন না this
  • আপনি নাম ধরে কল করবেন এমন ফাংশনগুলির জন্য ফাংশন ঘোষণাগুলি ব্যবহার করুন (কারণ তারা উত্তোলন করা হয়েছে)।
  • কলব্যাকগুলির জন্য তীর ফাংশনগুলি ব্যবহার করুন (কারণ তারা ক্ষুন্ন হতে থাকে)।

নীচে আপনার "ES6 এ ফাংশন নোটেশনের জন্য গাইডলাইন" বিভাগের সাথে 100% সম্মত হন - বিশেষত উত্তোলন এবং ইনলাইন কলব্যাক ফাংশন সহ। চমৎকার উত্তর!
জেফ ম্যাকক্লাউড

1

সরল উপায়ে,

var a =20; function a(){this.a=10; console.log(a);} 
//20, since the context here is window.

আরেকটি উদাহরণ:

var a = 20;
function ex(){
this.a = 10;
function inner(){
console.log(this.a); //can you guess the output of this line.
}
inner();
}
var test = new ex();

উত্তর: কনসোলটি 20 মুদ্রণ করবে।

কারণ যখনই কোনও ক্রিয়াকলাপটি সম্পাদন করা হয় তার নিজস্ব স্ট্যাক তৈরি হয়, উদাহরণস্বরূপ exফাংশনটি newঅপারেটরের সাথে সঞ্চালিত হয় তাই একটি প্রসঙ্গ তৈরি করা হবে এবং কখনinner এটি কার্যকর করা হলে জেএস একটি নতুন স্ট্যাক তৈরি করবে এবং innerফাংশনটি সম্পাদন করবে global contextযদিও সেখানে একটি রয়েছে স্থানীয় প্রসঙ্গ।

সুতরাং, আমরা চাই inner কোনও স্থানীয় প্রসঙ্গটি ফাংশন করতে যা আমাদের exপ্রসঙ্গটি অভ্যন্তরীণ ফাংশনে আবদ্ধ করতে হবে।

তীরগুলি এই সমস্যাটি সমাধান করে পরিবর্তে Global contextসেগুলি গ্রহণের পরিবর্তে local contextযদি কোনও উপস্থিত থাকে। ইন given example,একে চালনা করবেnew ex() যেমন this

সুতরাং, সমস্ত ক্ষেত্রে যেখানে বাঁধাই স্পষ্ট হয় তীরগুলি ডিফল্ট দ্বারা সমস্যার সমাধান করে।


1

তীর ফাংশন বা ল্যাম্বডাস ই এস in. এ প্রবর্তিত হয়েছিল নূন্যতম বাক্য গঠনতে এর কমনীয়তা বাদে, সর্বাধিক উল্লেখযোগ্য কার্যকরী পার্থক্যটি একটি তীর ফাংশনের অভ্যন্তরে বিভক্ত হওয়া isthis

ইন নিয়মিত ফাংশন এক্সপ্রেশন, thisশব্দ উপর ভিত্তি করে বিভিন্ন মান আবদ্ধ হয় প্রেক্ষাপটে যেখানে এটি বলা হয়।

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

কোনও বস্তুর পদ্ধতি হিসাবে সীমাবদ্ধতা তীর-ফাংশন

// this = global Window
let objA = {
 id: 10,
 name: "Simar",
 print () { // same as print: function() 
  console.log(`[${this.id} -> ${this.name}]`);
 }
}
objA.print(); // logs: [10 -> Simar]
objA = {
 id: 10,
 name: "Simar",
 print: () => {
  // closes over this lexically (global Window)
  console.log(`[${this.id} -> ${this.name}]`);
 }
};
objA.print(); // logs: [undefined -> undefined]

ক্ষেত্রে objA.print()যখন print()পদ্ধতি নিয়মিত ব্যবহার নির্ধারণ করা function , এটা সমাধানে দ্বারা কাজ thisসঠিকভাবে objAপদ্ধতি আবাহন জন্য কিন্তু যখন একটি তীর হিসাবে সংজ্ঞায়িত করা ব্যর্থ =>ফাংশন। কারণ thisকোনও নিয়মিত ক্রিয়াকলাপে যখন কোনও বস্তুর ( objA) তে একটি পদ্ধতি হিসাবে আহ্বান করা হয়, তখন এটিই বস্তু। যাইহোক, একটি তীর ফাংশনের ক্ষেত্রে, এটি সংক্ষিপ্ত ক্ষেত্রের সাথে সংক্ষিপ্তভাবে thisআবদ্ধ হয়ে যায় thisযেখানে এটি সংজ্ঞায়িত হয়েছিল (আমাদের ক্ষেত্রে বৈশ্বিক / উইন্ডো) এবং এটি পদ্ধতি হিসাবে চলার সময় এটি একই থাকে objA

কোনও বস্তু BUT এর পদ্ধতি (গুলি) এ নিয়মিত ফাংশনগুলির উপরে তীর-কার্যকারণের সুবিধা কেবলমাত্র যখন thisসময় সংজ্ঞায় স্থির ও সীমাবদ্ধ হওয়ার আশা করা হয়।

/* this = global | Window (enclosing scope) */

let objB = {
 id: 20,
 name: "Paul",
 print () { // same as print: function() 
  setTimeout( function() {
    // invoked async, not bound to objB
    console.log(`[${this.id} -> ${this.name}]`);
  }, 1)
 }
};
objB.print(); // logs: [undefined -> undefined]'
objB = {
 id: 20,
 name: "Paul",
 print () { // same as print: function() 
  setTimeout( () => {
    // closes over bind to this from objB.print()
    console.log(`[${this.id} -> ${this.name}]`);
  }, 1)
 }
};
objB.print(); // logs: [20 -> Paul]

ক্ষেত্রে objB.print()যেখানে print()পদ্ধতি ফাংশন হিসাবে সংজ্ঞায়িত যে পূজা করা হয় console.log([$ {this.id} -> {this.name}] )অ্যাসিঙ্ক্রোনাস একটি কল-ব্যাক হিসেবে setTimeout , thisসঠিকভাবে সমাধান objBযখন একটি তীর ফাংশন কল-ব্যাক হিসাবে ব্যবহৃত হয় কিন্তু ব্যর্থ যখন কল-ব্যাককে নিয়মিত ফাংশন হিসাবে সংজ্ঞায়িত করা হয়। এর কারণ এটি হ'ল তীর =>ফাংশনটি তার পিতামাতার কাছ থেকে লেন্সিকভাবে setTimeout(()=>..)বন্ধ হয়ে গেছে this। নামোচ্চারণের objB.print()যার ফলে এটি সংজ্ঞায়িত। অন্যান্য-কথায়, তীর =>ফাংশন জন্য পাস করতে setTimeout(()==>...বাধ্য objBতার thisকারণ নামোচ্চারণের মধ্যে objB.print() thisছিলobjB নিজেই।

আমরা সহজেই ব্যবহার করতে পারলাম Function.prototype.bind(), কল-ব্যাকটিকে নিয়মিত ফাংশন ওয়ার্ক হিসাবে সংজ্ঞায়িত করতে, এটি সঠিককে আবদ্ধ করে this

const objB = {
 id: 20,
 name: "Singh",
 print () { // same as print: function() 
  setTimeout( (function() {
    console.log(`[${this.id} -> ${this.name}]`);
  }).bind(this), 1)
 }
}
objB.print() // logs: [20 -> Singh]

যাইহোক, অ্যাসিঙ্ক কল-ব্যাকের ক্ষেত্রে তীর ফাংশনগুলি কার্যকর এবং কম ত্রুটিযুক্ত প্রবণতা রয়েছে যেখানে আমরা thisফাংশনগুলির সংজ্ঞা দেওয়ার সময় এটি জানি এবং এটি আবদ্ধ হওয়া উচিত।

তীর-সীমাবদ্ধতার সীমাবদ্ধতা যেখানে এটি অনুরোধগুলি জুড়ে পরিবর্তিত হওয়া দরকার

যে কোনও সময়, আমাদের ফাংশন প্রয়োজন যাঁদের thisপ্রার্থনার সময় পরিবর্তন করা যেতে পারে, আমরা তীর ফাংশন ব্যবহার করতে পারি না।

/* this = global | Window (enclosing scope) */

function print() { 
   console.log(`[${this.id} -> {this.name}]`);
}
const obj1 = {
 id: 10,
 name: "Simar",
 print // same as print: print
};
obj.print(); // logs: [10 -> Simar]
const obj2 = {
 id: 20,
 name: "Paul",
};
printObj2 = obj2.bind(obj2);
printObj2(); // logs: [20 -> Paul]
print.call(obj2); // logs: [20 -> Paul]

উপরের const print = () => { console.log(কোনওটি তীর ফাংশন [{{this.id} -> {this.name}] এর );}সাথে কাজ thisকরবে না কারণ এটি পরিবর্তন করা যায় না এবং thisএটি সংলগ্ন ক্ষেত্রের সাথে আবদ্ধ থাকবে যেখানে এটি সংজ্ঞায়িত হয়েছিল (গ্লোবাল / উইন্ডো)। এই সমস্ত উদাহরণে, আমরা একের পর এক বিভিন্ন অবজেক্ট ( obj1এবং obj2) দিয়ে একই ফাংশনটি চালু করেছি , উভয়ই print()ফাংশন ঘোষণার পরে তৈরি হয়েছিল।

এগুলি নিখুঁত উদাহরণ ছিল, তবে আসুন আরও কিছু বাস্তব জীবনের উদাহরণগুলি সম্পর্কে ভাবি। যদি আমাদের reduce()পদ্ধতিটি একইভাবে কাজ arrays করতে হয় তবে চলতে থাকে তবে আমরা আবার এটি একটি ল্যাম্বডা হিসাবে সংজ্ঞায়িত করতে পারি না, কারণ এটির অনুরোধ thisপ্রসঙ্গে, অর্থাত্ সিদ্ধান্ত নেওয়া দরকার। যে অ্যারেটিতে এটি চাওয়া হয়েছিল

এই কারণে, constructorফাংশনগুলি কখনই তীর ফাংশন হিসাবে সংজ্ঞায়িত করা যায় না , কারণ thisএটির ঘোষণার সময় কোনও কনস্ট্রাক্টর ফাংশন সেট করা যায় না। প্রতিবার কোনও কন্সট্রাক্টর ফাংশনটি newকীওয়ার্ডের সাথে আহ্বান করা হলে একটি নতুন অবজেক্ট তৈরি হয় যা পরে সেই নির্দিষ্ট অনুরোধে আবদ্ধ হয়ে যায়।

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

'use strict'
var button = document.getElementById('button');
button.addEventListener('click', function {
  // web-api invokes with this bound to current-target in DOM
  this.classList.toggle('on');
});
var button = document.getElementById('button');
button.addEventListener('click', () => {
  // TypeError; 'use strict' -> no global this
  this.classList.toggle('on');
});

এঙ্গুলার 2+ এবং Vue.js এর মতো ফ্রেমওয়ার্কগুলিতে টেম্পলেট-উপাদান বন্ডিং পদ্ধতিগুলি নিয়মিত ফাংশন / পদ্ধতি হিসাবে প্রত্যাশার কারণ হিসাবে thisতাদের অনুরোধটি বাধ্যতামূলক ফাংশনগুলির জন্য ফ্রেমওয়ার্ক দ্বারা পরিচালিত হয় the (কৌনিকটি ভিউ-টেম্পলেট বাইন্ডিং ফাংশনগুলির অনুরোধের জন্য অ্যাসিঙ্ক প্রসঙ্গ পরিচালনা করতে অঞ্চল.জেএস ব্যবহার করে)।

অন্যদিকে, প্রতিক্রিয়াতে , যখন আমরা ইভেন্ট-হ্যান্ডলার হিসাবে কোনও উপাদানটির পদ্ধতিটি পাস করতে চাই উদাহরণস্বরূপ <input onChange={this.handleOnchange} />আমাদের handleOnchanage = (event)=> {this.props.onInputChange(event.target.value);}প্রতিটি অনুরোধের মতো একটি তীর ফাংশন হিসাবে সংজ্ঞায়িত করা উচিত , আমরা এটি রেন্ডারের জন্য জেএসএক্স উত্পাদনকারী উপাদানটির একই উদাহরণ হতে চাই want ডোম উপাদান।


এই নিবন্ধটি আমার মাঝারি প্রকাশনাতেও উপলব্ধ। আপনি যদি আর্টিলিল পছন্দ করেন, বা কোনও মতামত এবং পরামর্শ দিয়েছেন, দয়া করে হাততালি বা মিডিয়াম মন্তব্য মন্তব্য করুন ।

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