ফাংশন এক্সপ্রেশন

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

const myVariable = function() { };

তারপরে আপনি ভেরিয়েবলের শনাক্তকারী ব্যবহার করে সেই ফাংশন এক্সপ্রেশনগুলিকে কল করতে পারেন:

const myVariable = function() {
    console.log( "This is my function." );
};

myVariable();
> "This is my function."

আপনি ফাংশন ঘোষণার অনুরূপ একটি সিনট্যাক্স ব্যবহার করে নামযুক্ত ফাংশন তৈরি করতে ফাংশন এক্সপ্রেশন ব্যবহার করতে পারেন:

const myVariable = function myFunction() {
    console.log( "This is my function." );
};

myVariable();
> "This is my function."

যাইহোক, ফাংশন ঘোষণার বিপরীতে, একটি নামযুক্ত ফাংশন এক্সপ্রেশন শুধুমাত্র ফাংশনের মধ্যেই ফাংশন নামের দ্বারা অ্যাক্সেস করা যেতে পারে:

const myVariable = function myFunction() {
  console.log( `I'm a ${ typeof myFunction }.`);
};

typeof myFunction;
> "undefined"

typeof myVariable;
> "function"

myVariable();
> "I'm a function."

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

const myVariable = function myFunction() {
    console.log( "One second elapsed." );
    setTimeout( myFunction, 1000 );
};

setTimeout( myVariable, 1000 );
> "One second elapsed."
> "One second elapsed."
> "One second elapsed."

তীর ফাংশন এক্সপ্রেশন

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

আপনি একটি তীর ফাংশন তৈরি করতে পারেন যেখানে একটি অভিব্যক্তি প্রত্যাশিত, উদাহরণস্বরূপ, একটি ভেরিয়েবলের জন্য নির্ধারিত মান হিসাবে। এটির সবচেয়ে সাধারণ আকারে, একটি তীর ফাংশন শূন্য বা তার বেশি পরামিতি সমন্বিত একজোড়া মিলে যাওয়া বন্ধনীর সমন্বয়ে গঠিত, একটি তীর একটি একক সমান চিহ্ন এবং অক্ষরের চেয়ে বড় ( => ) এবং একজোড়া মিলে যাওয়া কোঁকড়া বন্ধনীর সমন্বয়ে গঠিত। ফাংশন বডি ধারণকারী:

const myFunction = () => {};

কিছু শর্তের অধীনে, আপনি সিনট্যাক্সটিকে আরও কমপ্যাক্ট করতে পারেন। আপনি যদি শুধুমাত্র একটি প্যারামিটার ব্যবহার করেন, তাহলে আপনি প্রারম্ভিক বন্ধনীগুলি ছেড়ে দিতে পারেন:

const myFunction = myParameter => {};

আপনি যখন ফাংশন বডি একটি একক অভিব্যক্তির মান ফেরত দিতে চান, তখন ফাংশন বডিটি কোঁকড়া বন্ধনীতে আবদ্ধ না করা বা return কীওয়ার্ডের প্রয়োজন হয় না:

const myFunction = () => 2 + 2

myFunction()
> 4

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

function myParentFunction() {
    this.myProperty = true;
    let myFunction = () => {
            console.log( this );
    }
    myFunction();
};

let myInstance = new myParentFunction();
> Object { myProperty: true }

তীর ফাংশন কল

তীর ফাংশন অন্যান্য ধরনের ফাংশনের মতো একইভাবে আর্গুমেন্টকে আবদ্ধ করে না। একটি তীর ফাংশনের বডিতে একটি arguments অবজেক্ট সেই তীর ফাংশনের সবচেয়ে কাছের আভিধানিকভাবে ঘেরা পরিবেশ থেকে তার মান উত্তরাধিকার সূত্রে পায়:

function myFunction() {
    let myArrowFunction = () => {
            console.log( arguments[ 0 ] );
    }
    myArrowFunction( true );
};

myFunction( false );
> false

এই উদাহরণে, আর্গুমেন্ট false সাথে কল করা একটি বাইরের ফাংশন আর্গুমেন্ট true সহ একটি অভ্যন্তরীণ তীর ফাংশনকে কল করে। কারণ তীর ফাংশনের ভিতরের arguments অবজেক্টটি বাইরের ফাংশনে বাঁধাইয়ের সাথে সমাধান করে, অভ্যন্তরীণ ফাংশনটি বাইরের ফাংশনের false লগ করে।

যদি প্যারেন্ট প্রসঙ্গ থেকে উত্তরাধিকারসূত্রে arguments অবজেক্ট না থাকে, তীর ফাংশনের arguments অবজেক্টটি সংজ্ঞায়িত করা হয় না এবং এটি অ্যাক্সেস করার চেষ্টা করলে একটি ত্রুটি দেখা দেয়:

let myArrowFunction = () => {
    console.log(arguments);
};
myArrowFunction( true );
> Uncaught ReferenceError: arguments is not defined

অবিলম্বে আমন্ত্রিত ফাংশন এক্সপ্রেশন (IIFE)

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

(function() {
    console.log( "IIFE.")
    }
)();
> "IIFE."

(function() {
    console.log( "IIFE.")
    }
());
> "IIFE."

প্রথম উদাহরণ দলবদ্ধ ফাংশন অভিব্যক্তি কল. দ্বিতীয় উদাহরণটি গ্রুপিং অপারেটরদের মধ্যে একটি ফাংশন ঘোষণাকে কল করে এবং শেষ ফলাফলটি তারপর একটি গোষ্ঠীবদ্ধ অভিব্যক্তি হিসাবে মূল্যায়ন করা হয়। ফলাফল উভয় ক্ষেত্রেই একই।

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

( () => {
    console.log( "IIFE." );
}() );
> Uncaught SyntaxError: missing ) in parenthetical

যেহেতু গ্রুপিং অপারেটররা একটি অভিব্যক্তি আশা করে, তাদের মধ্যে তীর ফাংশনটি সংজ্ঞায়িত করা হয়, তাদের অনুসরণকারী বন্ধনীগুলিকে গোষ্ঠীবদ্ধ অভিব্যক্তিকে কল করতে দেয়:

( () => {
    console.log( "IIFE." );
} )();
> "IIFE."

লিগ্যাসি অ্যাপ্লিকেশন, স্কোপ পরিচালনার জন্য প্রায়শই ব্যবহৃত IIFEs, বিশেষত ফাংশন-স্কোপড ভেরিয়েবল এবং ফাংশন ঘোষণার সাথে বিশ্বব্যাপী সুযোগকে দূষিত না করার জন্য। ES6-এ ব্লক স্কোপিং প্রবর্তনের আগে, বিশ্বব্যাপী সুযোগের দুর্ঘটনাজনিত দূষণ রোধ করার জন্য একটি আইআইএফই-তে একটি সম্পূর্ণ স্ক্রিপ্ট মোড়ানো সাধারণ অভ্যাস ছিল।

আপনার উপলব্ধি পরীক্ষা করুন

আপনি ফাংশনের বাইরে নাম দ্বারা একটি নামযুক্ত ফাংশন অভিব্যক্তি কল করতে পারেন?

না
হ্যাঁ