একটি ফাংশনকে আমরা First Class ফাংশন বলতে পারি যদি ফাংশনটি নিচের ৬টি নিয়ম মেনে চলে :

  1. ফাংশনটি একটি ভেরিয়েবলে সংরক্ষণ করা যেতে পারে।
  2. এটি একটি অ্যারেতে সংরক্ষণ করা যেতে পারে।
  3. এটি একটি অবজেক্টে সংরক্ষণ করা যেতে পারে।
  4. আমরা প্রয়োজনমত যেকোন সময় ফাংশনটি তৈরি করতে পারি
  5. ফাংশনটি আর্গুমেন্ট হিসেবে পাঠাতে পারি।
  6. আমরা একটি ফাংশন থেকে অন্য আরেকটি ফাংশনকে রিটার্ন করতে পারি।

প্রথমে একটি ফাংশন তৈরি করে নিই :

function add(a,b) {
    return a+b
}

এখানে add একটি ফাংশন যা শুধুমাত্র a আর b ভেরিয়েবলের যোগফল রিটার্ন করবে।

আমরা পরীক্ষা করে দেখব add ফাংশনটি First Class ফাংশনের নিয়ম মেনে চলে কিনা।

নিয়ম ১ : ফাংশনটি একটি ভেরিয়েবলে সংরক্ষণ করা যেতে পারে

var sum = add
console.log(typeof sum)
console.log(sum(5, 3))

এখানে প্রথমে add নামক একটি ফাংশন তৈরি করেছি। এরপর sum ভেরিয়েবলের ভ্যালু হিসেবে add ফাংশনটি নিয়েছি এবং কনসোলে typeof sum করে দেখতে পাব sum ভেরিয়েবলটি একটি ফাংশন। সবশেষে sum ভেরিয়েবলটিকে call করতে পারছি, কারণ এটি add ফাংশনটিকে সংরক্ষণ করেছে। অর্থাৎ add ফাংশনটি ১ম নিয়মটি মেনে চলছে।

নিয়ম ২ : এটি একটি অ্যারেতে সংরক্ষণ করা যেতে পারে।

var arr = []
arr.push(add)
console.log(arr)
console.log(arr[0](9, 4))

আমরা arr নামক একটি অ্যারেতে ফাংশনটি push করেছি। কনসোল করার পর দেখতে পাব arr অ্যারেতে add নামক একটি এলিমেন্ট রয়েছে, যার টাইপ হচ্ছে ফাংশন। সবশেষে অ্যারেটির শূন্য ইনডেক্সকে কনসোল করেছি, কারণ অ্যারেটির প্রথম ইনডেক্সে add ফাংশনটি সংরক্ষণ করা আছে। অর্থাৎ add ফাংশনটি ২য় নিয়মটিও মেনে চলছে।

নিয়ম ৩ : এটি একটি অবজেক্টে সংরক্ষণ করা যেতে পারে।

var obj = {
    addition : add
}
console.log(typeof obj.addition)
console.log(obj.addition(2, 7))

এখানে আমরা obj অবজেক্টের মধ্যে addition প্রোপার্টিতে add ফাংশনটি সংরক্ষণ করেছি। এখন কনসোলে typeof করে দেখতে পাব addition প্রোপার্টিটি একটি ফাংশন। সবশেষে addition প্রোপার্টিটিকে ফাংশন এর মত call করতে পারছি। অর্থাৎ add ফাংশনটি ৩য় নিয়মটি মেনে চলছে।

নিয়ম ৪ : আমরা প্রয়োজনমত যেকোন সময় ফাংশনটি তৈরি করতে পারি

setTimeout(function () {
    console.log("I have created...")
},1000)

এখানে setTimeout ফাংশনটি প্রথম আর্গুমেন্ট হিসেবে একটি Callback ফাংশন নিয়েছে যা ১০০০ মিলিসেকেন্ড পর এক্সিকিউট হবে। অর্থাৎ আমরা যেকোন সময় প্রয়োজনমত একটি ফাংশনকে এক্সিকিউট করাতে পারি।