Arrow Functions ES6 (ECMAScript 2015) এ একটি নতুন ফাংশন ডিক্লেয়ারেশন সিনট্যাক্স যা সাধারণ function কিওয়ার্ডের বিকল্প। Arrow Functions কোডকে সংক্ষিপ্ত, পরিষ্কার এবং পড়তে সহজ করে তোলে। এছাড়া এগুলোর মধ্যে this এর ব্যবহারের ক্ষেত্রে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে।
Arrow Function এর সিনট্যাক্স
Arrow Function এর সাধারণ সিনট্যাক্স হল:
const functionName = (parameters) => {
// function body
}
উদাহরণ:
const greet = (name) => {
return `Hello, ${name}`;
};
console.log(greet("John")); // "Hello, John"
যেহেতু Arrow Function খুবই সংক্ষিপ্ত, তাই যদি ফাংশনটির মধ্যে শুধুমাত্র একটি এক্সপ্রেশন থাকে, আপনি return এবং {} বাদ দিয়েও Arrow Function লিখতে পারেন:
const greet = (name) => `Hello, ${name}`;
console.log(greet("John")); // "Hello, John"
Arrow Functions এর বৈশিষ্ট্যসমূহ
কনসাইজ সিনট্যাক্স (Concise Syntax): Arrow Functions সাধারণ
functionকিওয়ার্ডের তুলনায় অনেক সংক্ষিপ্ত। আপনি সহজে ফাংশন ডিফাইন করতে পারেন এবং কোডের আকার ছোট রাখতে পারেন।উদাহরণ:
// সাধারণ function function sum(a, b) { return a + b; } // Arrow function const sum = (a, b) => a + b;Implicit Return: যদি ফাংশনের মধ্যে একটি একক এক্সপ্রেশন থাকে, তাহলে
returnকিওয়ার্ড এবং{}বাদ দেয়া যায়। ফাংশন নিজে থেকেই সেই এক্সপ্রেশনটি রিটার্ন করে।উদাহরণ:
const square = (x) => x * x; // Return is implicit console.log(square(5)); // 25thisএর আচরণ:thisএর আচরণ Arrow Functions এ সাধারণ ফাংশনের তুলনায় একটু ভিন্ন। সাধারণ ফাংশনে,thisচলমান ফাংশনের কনটেক্সটের উপর ভিত্তি করে পরিবর্তিত হয়। কিন্তু Arrow Function এthisশব্দটি lexical scoping অনুসরণ করে। এর মানে হলো,thisমূল ফাংশন বা অবজেক্টেরthisকনটেক্সটের সাথে সম্পর্কিত হয়, যেখান থেকে Arrow Function কল করা হয়।উদাহরণ:
const person = { name: "John", greet: function() { setTimeout(() => { console.log(`Hello, ${this.name}`); // Arrow function retains the `this` of the person object }, 1000); } }; person.greet(); // "Hello, John" after 1 secondএখানে, Arrow Function এর
thispersonঅবজেক্টেরthisকে রেফারেন্স করে। যদি এখানে সাধারণ function ব্যবহার করা হতো, তাহলেthisসেটির নিজস্ব কনটেক্সটের উপর ভিত্তি করে পরিবর্তিত হত, এবংthis.nameত্রুটি (error) দেখাতো।Parameter Handling: Arrow Functions এর ক্ষেত্রে যদি একমাত্র প্যারামিটার থাকে, তবে প্যারামিটারগুলোর ব্র্যাকেট
{}বাদ দেয়া যায়।উদাহরণ:
const double = x => x * 2; // Single parameter, no parentheses required console.log(double(4)); // 8তবে, যদি একাধিক প্যারামিটার থাকে, তাহলে প্যারামিটারগুলো ব্র্যাকেটে রাখতে হবে:
const sum = (a, b) => a + b; console.log(sum(3, 4)); // 7Arrow Functions এর
argumentsব্যবহার: সাধারণ ফাংশনের মতো, Arrow Functions এর কোনোargumentsঅবজেক্ট থাকে না। যদি Arrow Function এর ভিতরেargumentsব্যবহার করার প্রয়োজন হয়, তবে সেটাrest parametersব্যবহার করে করতে হবে।উদাহরণ:
const add = (...args) => { return args.reduce((total, num) => total + num, 0); }; console.log(add(1, 2, 3, 4)); // 10
Arrow Functions এর ব্যবহার
Array Methods এর সাথে ব্যবহার: Arrow Functions খুবই জনপ্রিয় হয় Array methods এর সাথে, যেমন
map,filter,reduceইত্যাদি।উদাহরণ (map):
const numbers = [1, 2, 3, 4, 5]; const squares = numbers.map(num => num * num); console.log(squares); // [1, 4, 9, 16, 25]Event Handlers: Arrow Functions সহজভাবে event handlers এর জন্য ব্যবহার করা যায়, বিশেষ করে যখন
thisএর কনটেক্সট গুরুত্বপূর্ণ।উদাহরণ:
const button = document.querySelector("button"); button.addEventListener("click", () => { console.log("Button clicked!"); });
সারাংশ
Arrow Functions একটি সহজ, সংক্ষিপ্ত এবং শক্তিশালী ফাংশন ডিক্লেয়ারেশন পদ্ধতি। এগুলি বিশেষত this এর lexical scoping এবং implicit return ফিচারের জন্য জনপ্রিয়। Arrow Functions কে ছোট স্কোপের ক্ষেত্রে ব্যবহার করে কোড লেখা আরও পরিষ্কার এবং সহজ হয়ে ওঠে।
Arrow Functions ES6 (ECMAScript 2015) এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা সাধারণ function কিওয়ার্ডের তুলনায় কোডকে আরও সংক্ষিপ্ত, পরিষ্কার এবং বেশি রিডেবল করে তোলে। Arrow Functions ব্যবহার করে ফাংশন ডিক্লেয়ারেশন অনেক সহজ এবং কোডের আকার ছোট করা যায়। এর পাশাপাশি, this কীওয়ার্ডের ব্যবহারেও কিছু গুরুত্বপূর্ণ পরিবর্তন এনেছে।
Arrow Function এর সিনট্যাক্স
Arrow Function এর মৌলিক সিনট্যাক্স:
const functionName = (parameters) => {
// function body
}
যদি ফাংশনটির মধ্যে একটি একক এক্সপ্রেশন থাকে, তবে আপনি return এবং {} বাদ দিয়েও Arrow Function লিখতে পারেন। এই ক্ষেত্রে ফাংশনটি স্বয়ংক্রিয়ভাবে এক্সপ্রেশনটি রিটার্ন করবে।
const functionName = (parameters) => expression;
Arrow Functions এর উদাহরণ
1. সাধারণ Arrow Function
const greet = (name) => {
return `Hello, ${name}`;
};
console.log(greet("John")); // "Hello, John"
2. Implicit Return
যদি ফাংশনের মধ্যে শুধুমাত্র একটি এক্সপ্রেশন থাকে, তবে return কিওয়ার্ড এবং {} ব্রেসেস বাদ দেওয়া যায়। এটি implicit return নামে পরিচিত।
const greet = (name) => `Hello, ${name}`;
console.log(greet("John")); // "Hello, John"
এখানে greet ফাংশনটি implicit return ব্যবহার করে। এক্সপ্রেশনটি সরাসরি রিটার্ন করা হয়েছে, কোন return কিওয়ার্ড ব্যবহার করা হয়নি।
3. Multiple Parameters
যদি একাধিক প্যারামিটার থাকে, তবে প্যারামিটারগুলো অবশ্যই ব্র্যাকেটে রাখতে হবে।
const sum = (a, b) => a + b;
console.log(sum(3, 4)); // 7
Arrow Functions এর বৈশিষ্ট্য
- কনসাইজ এবং পরিষ্কার সিনট্যাক্স (Concise and Clean Syntax): Arrow Functions কোডকে সংক্ষিপ্ত করে, যার ফলে কোডের রিডেবিলিটি (readability) অনেক বেড়ে যায়। এটি কোড লিখতে সাহায্য করে এবং কোডের আকার ছোট রাখে।
- Implicit Return: যদি ফাংশনের মধ্যে একটি একক এক্সপ্রেশন থাকে, তবে আপনি
returnকিওয়ার্ড ব্যবহার না করেও সেই এক্সপ্রেশনকে রিটার্ন করতে পারেন। এটি কোডের আকার ছোট রাখে এবং লেখার সময় সহজ করে। thisএর নতুন আচরণ (Lexicalthis): সাধারণfunctionকিওয়ার্ড ব্যবহার করলে,thisচলমান কনটেক্সট (ফাংশন কনটেক্সট) অনুযায়ী পরিবর্তিত হয়। তবে Arrow Functions এরthisমূল কনটেক্সট (যেমন, ফাংশনটি কোথায় ডিফাইন করা হয়েছে) থেকে উত্তরাধিকারসূত্রে পাওয়াthisকনটেক্সট ব্যবহার করে। Arrow Function এর মাধ্যমেthisএর আচরণ অনেক সহজ এবং সাবলীল হয়, কারণ এটি lexical scoping অনুসরণ করে।উদাহরণ:
const person = { name: "John", greet: function() { setTimeout(() => { console.log(`Hello, ${this.name}`); }, 1000); } }; person.greet(); // "Hello, John" after 1 secondএখানে, Arrow Function এর
thisমূল অবজেক্টpersonএরthisকে রেফারেন্স করে।Parameter Handling: Arrow Functions সাধারণ ফাংশনের মতো প্যারামিটার গ্রহণ করতে পারে। যদি একমাত্র প্যারামিটার থাকে, তাহলে প্যারামিটারগুলোর ব্র্যাকেট
{}বাদ দেয়া যায়।উদাহরণ:
const double = x => x * 2; console.log(double(4)); // 8যদি একাধিক প্যারামিটার থাকে, তবে সেগুলো অবশ্যই ব্র্যাকেট
{}এর মধ্যে রাখতে হবে।const sum = (a, b) => a + b; console.log(sum(3, 4)); // 7
Arrow Functions এর সুবিধা
- সংক্ষিপ্ততা: Arrow Functions সাধারণ ফাংশন ডিক্লেয়ারেশনের তুলনায় সংক্ষিপ্ত এবং আরও রিডেবল।
thisএর সহজ ব্যবহার:thisএর আচরণ সহজতর, কারণ Arrow Functions lexical scoping অনুসরণ করে।- Implicit Return: একক এক্সপ্রেশন থাকলে কোডকে আরও ছোট এবং পরিষ্কার করা সম্ভব।
Arrow Functions এর সীমাবদ্ধতা
Constructor হিসেবে ব্যবহার করা যাবে না: Arrow Functions constructor function হিসেবে কাজ করতে পারে না। অর্থাৎ,
newকিওয়ার্ড ব্যবহার করে Arrow Function দিয়ে অবজেক্ট তৈরি করা যাবে না।const Person = (name) => { this.name = name; // Error: Arrow functions cannot be used as constructors }; const john = new Person("John");No
argumentsObject: Arrow Functions এর মধ্যেargumentsঅবজেক্ট ব্যবহার করা যায় না। তবে, আপনি যদিargumentsঅবজেক্ট চান, তবে সাধারণ ফাংশন ব্যবহার করতে হবে।const sum = () => { console.log(arguments); // Error: arguments is not defined }; sum(1, 2, 3);
সারাংশ
Arrow Functions ES6 এর একটি শক্তিশালী বৈশিষ্ট্য যা কোডকে সংক্ষিপ্ত, পরিষ্কার এবং রিডেবল করে তোলে। এটি ফাংশন ডিক্লেয়ারেশনের জন্য একটি সহজ এবং কার্যকর উপায়, বিশেষ করে যখন ছোট ফাংশন লিখতে হয়। this এর সহজ ব্যবহারের জন্য Arrow Functions অনেক বেশি জনপ্রিয়। তবে কিছু সীমাবদ্ধতা রয়েছে, যেমন constructor function হিসেবে ব্যবহার করা যাবে না এবং arguments অবজেক্ট সমর্থন করে না।
ES6 এর Arrow Functions এবং Traditional Functions (পূর্বের function কিওয়ার্ড দিয়ে ডিফাইন করা ফাংশন) মধ্যে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে। এই পার্থক্যগুলো syntax, this কনটেক্সট, এবং arguments এর ব্যবহারসহ অন্যান্য বিষয়গুলোকে প্রভাবিত করে। নিচে Arrow Function এবং Traditional Function এর মধ্যে প্রধান পার্থক্যগুলো বিস্তারিতভাবে আলোচনা করা হলো।
1. সিনট্যাক্স (Syntax)
Traditional Function:
function greet(name) {
return `Hello, ${name}`;
}
এখানে function কিওয়ার্ড দিয়ে ফাংশন ডিফাইন করা হচ্ছে।
Arrow Function:
const greet = (name) => {
return `Hello, ${name}`;
};
Arrow Function এর সিনট্যাক্স বেশ সংক্ষিপ্ত। এখানে function কিওয়ার্ড নেই এবং আর্গুমেন্টের পর সরাসরি => চিহ্ন ব্যবহার করা হয়েছে। একটি একক এক্সপ্রেশন থাকলে {} এবং return কিওয়ার্ড ছাড়াও Arrow Function ব্যবহার করা যায়:
const greet = (name) => `Hello, ${name}`;
2. this কনটেক্সট (Context of this)
Traditional Function:
this এর মান ফাংশন কিভাবে কল করা হয় তার উপর নির্ভর করে। সাধারণভাবে, this অবজেক্টের কনটেক্সটে পরিবর্তিত হয়।
function greet() {
console.log(this); // `this` refers to the context of function call
}
greet(); // `this` refers to the global object (in browser: window)
যদি এটি একটি অবজেক্টের মধ্যে কল করা হয়, তবে this ওই অবজেক্টকেই রেফার করবে।
const person = {
name: "John",
greet: function() {
console.log(this.name);
}
};
person.greet(); // "John"
Arrow Function:
Arrow Functions এ this এর মান lexical scoping অনুসরণ করে, অর্থাৎ যেখানে Arrow Function তৈরি হয়, সেখানকার this কে রেফার করবে। Arrow Function তার this ধারণ করে, যা বাইরের ফাংশন বা অবজেক্টের this রেফার করে।
const person = {
name: "John",
greet: () => {
console.log(this.name); // `this` doesn't refer to the person object
}
};
person.greet(); // undefined (because `this` refers to the global object, not the person)
এখানে, Arrow Function এর this গ্লোবাল স্কোপের this কে রেফার করছে, কারণ Arrow Function তার বাইরের স্কোপ থেকে this পান।
3. arguments অবজেক্ট
Traditional Function:
Traditional Function এর মধ্যে একটি arguments অবজেক্ট থাকে, যা সেই ফাংশনের সমস্ত আর্গুমেন্ট ধারণ করে (এটা এক ধরনের "pseudo-array")। এটি প্যারামিটার হিসেবে সরাসরি পাঠানো যেকোনো আর্গুমেন্টে অ্যাক্সেস দেয়।
function sum() {
console.log(arguments); // Array-like object of all arguments
return Array.from(arguments).reduce((acc, curr) => acc + curr, 0);
}
console.log(sum(1, 2, 3)); // 6
এখানে, arguments অবজেক্ট সব প্যারামিটার সম্বলিত একটি আকারহীন অ্যারে প্রদান করে।
Arrow Function:
Arrow Functions এর মধ্যে arguments অবজেক্ট থাকে না। আপনি যদি arguments ব্যবহার করতে চান, তাহলে আপনাকে Traditional Function ব্যবহার করতে হবে।
const sum = () => {
console.log(arguments); // Error: arguments is not defined
};
sum(1, 2, 3);
এখানে, Arrow Function এ arguments ব্যবহার করা সম্ভব নয়, কারণ এটি lexical scoping অনুসরণ করে এবং arguments অ্যাক্সেস করা যায় না।
4. Constructor Function (Constructor হিসেবে ব্যবহার)
Traditional Function:
Traditional Function গুলোকে constructor function হিসেবে ব্যবহার করা যায়। new কিওয়ার্ড দিয়ে ফাংশনকে কল করলে এটি একটি নতুন অবজেক্ট তৈরি করবে।
function Person(name) {
this.name = name;
}
const john = new Person("John");
console.log(john.name); // "John"
Arrow Function:
Arrow Functions কনস্ট্রাক্টর ফাংশন হিসেবে ব্যবহার করা যাবে না। যদি new কিওয়ার্ড ব্যবহার করা হয়, তবে ত্রুটি (error) হবে।
const Person = (name) => {
this.name = name;
};
const john = new Person("John"); // Error: Person is not a constructor
এখানে, Arrow Function কনস্ট্রাক্টর ফাংশন হিসেবে কাজ করবে না, কারণ এর this বাইরের স্কোপের this কে রেফার করে, নতুন অবজেক্ট তৈরি করার সময় নিজস্ব this কনটেক্সট তৈরি হয় না।
5. Return Value (রিটার্ন ভ্যালু)
Traditional Function:
সাধারণ function ডিফাইন করলে, যদি ফাংশনের মধ্যে একাধিক স্টেটমেন্ট থাকে, তবে return কিওয়ার্ড ব্যবহার করতে হবে:
function multiply(a, b) {
return a * b;
}
Arrow Function:
Arrow Function এর মধ্যে যদি একক এক্সপ্রেশন থাকে, তবে return কিওয়ার্ড ছাড়াই সেই এক্সপ্রেশন রিটার্ন হয়ে যায়:
const multiply = (a, b) => a * b;
এখানে, return কিওয়ার্ড প্রয়োজন নেই কারণ Arrow Function এক্সপ্রেশনকে সরাসরি রিটার্ন করে।
পার্থক্য সারাংশ
| বৈশিষ্ট্য | Traditional Function | Arrow Function |
|---|---|---|
| সিনট্যাক্স | function কিওয়ার্ড দিয়ে ফাংশন ডিফাইন করা হয় | => চিহ্ন দিয়ে ফাংশন ডিফাইন করা হয় |
this কনটেক্সট | ফাংশন কিভাবে কল করা হবে তার উপর নির্ভর করে | বাইরের স্কোপের this কে রেফার করে (lexical scoping) |
arguments অবজেক্ট | থাকে এবং আর্গুমেন্ট গুলি অ্যাক্সেস করা যায় | থাকে না, আর্গুমেন্ট ব্যবহার করতে হলে ঐ ফাংশনের মধ্যে অন্য উপায় প্রয়োজন |
| Constructor Function | new কিওয়ার্ড দিয়ে নতুন অবজেক্ট তৈরি করা যায় | new কিওয়ার্ড দিয়ে কাজ করবে না |
| Return Value | একাধিক স্টেটমেন্ট হলে return কিওয়ার্ড প্রয়োজন | এক্সপ্রেশন সরাসরি রিটার্ন হয়, return কিওয়ার্ড ছাড়া |
Arrow Functions সাধারণভাবে ছোট, কমপ্যাক্ট, এবং স্বচ্ছ কোড লেখার জন্য ব্যবহৃত হয়, তবে এর কিছু সীমাবদ্ধতা যেমন this এবং arguments সম্পর্কিত আচরণ, এগুলোর ব্যবহারকে নির্দিষ্ট পরিস্থিতির মধ্যে সীমাবদ্ধ করে।
ES6 (ECMAScript 2015) হল জাভাস্ক্রিপ্টের একটি বড় সংস্করণ যা অনেক নতুন বৈশিষ্ট্য এবং সিনট্যাক্স প্রদান করেছে। এই সংস্করণটি কোড লেখার প্রক্রিয়াকে আরও সহজ, পরিষ্কার এবং শক্তিশালী করেছে। নিচে ES6 এর কিছু প্রধান সিনট্যাক্স এবং ব্যবহারের নিয়ম তুলে ধরা হল।
1. Let এবং Const
ES6-এ let এবং const কিওয়ার্ড দিয়ে ভ্যারিয়েবল ডিক্লেয়ার করার নিয়ম এসেছে, যা var কিওয়ার্ডের বিকল্প হিসেবে ব্যবহৃত হয়।
let: ব্লক স্কোপড ভ্যারিয়েবল ডিক্লেয়ার করে, মান পরিবর্তনযোগ্য।const: ব্লক স্কোপড কনস্ট্যান্ট ভ্যারিয়েবল ডিক্লেয়ার করে, মান পরিবর্তনযোগ্য নয় (immutable)।
উদাহরণ:
let age = 25; // let দিয়ে ভ্যারিয়েবল
const name = "John"; // const দিয়ে কনস্ট্যান্ট ভ্যারিয়েবল
2. Arrow Functions (এরো ফাংশন)
Arrow Functions কোডকে সংক্ষিপ্ত ও পরিষ্কার করতে সহায়ক। এগুলিতে this এর ব্যবহারও সাধারণ ফাংশনের তুলনায় আলাদা।
সিনট্যাক্স:
const functionName = (parameters) => {
return expression;
}
উদাহরণ:
const add = (a, b) => a + b;
console.log(add(2, 3)); // 5
3. Template Literals
Template literals (backticks `) ব্যবহার করে আপনি সহজে স্ট্রিং ইন্টারপোলেশন এবং মাল্টি-লাইন স্ট্রিং তৈরি করতে পারেন।
উদাহরণ:
const name = "John";
const age = 30;
const greeting = `Hello, my name is ${name} and I am ${age} years old.`;
console.log(greeting); // "Hello, my name is John and I am 30 years old."
এছাড়া, মাল্টি-লাইন স্ট্রিংও সহজে লেখা যায়:
const message = `Hello,
How are you?`;
console.log(message);
4. Default Parameters
ES6 এ ফাংশনের প্যারামিটারের জন্য ডিফল্ট মান সেট করা সম্ভব। যদি ফাংশনে কোন আর্গুমেন্ট পাস না করা হয়, তবে ডিফল্ট মান ব্যবহার করা হবে।
উদাহরণ:
function greet(name = "Guest") {
console.log(`Hello, ${name}!`);
}
greet(); // "Hello, Guest!"
greet("John"); // "Hello, John!"
5. Destructuring
Destructuring এর মাধ্যমে অবজেক্ট বা অ্যারে থেকে ডেটা সহজে এক্সট্র্যাক্ট করা যায়। এটি কোডকে আরও পরিষ্কার এবং পাঠযোগ্য করে তোলে।
অ্যারে ডেস্ট্রাকচারিং:
const numbers = [1, 2, 3];
const [a, b] = numbers;
console.log(a, b); // 1, 2
অবজেক্ট ডেস্ট্রাকচারিং:
const person = { name: "John", age: 30 };
const { name, age } = person;
console.log(name, age); // "John", 30
6. Spread Operator (...)
Spread operator (...) দিয়ে আপনি অ্যারে বা অবজেক্টের উপাদানগুলো আলাদা আলাদা করে নিতে পারেন বা নতুন অ্যারে/অবজেক্ট তৈরি করতে পারেন।
অ্যারে স্প্রেড:
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];
console.log(arr2); // [1, 2, 3, 4, 5]
অবজেক্ট স্প্রেড:
const person = { name: "John", age: 30 };
const newPerson = { ...person, city: "New York" };
console.log(newPerson); // { name: "John", age: 30, city: "New York" }
7. Classes
ES6 এ class কিওয়ার্ডের মাধ্যমে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP) কনসেপ্টকে সমর্থন করা হয়েছে।
সিনট্যাক্স:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
const person1 = new Person("John", 30);
person1.greet(); // "Hello, my name is John and I am 30 years old."
8. Modules
ES6 মডিউল সিস্টেম প্রদান করেছে, যার মাধ্যমে আপনি কোড ভাগ করতে পারেন। একে export এবং import কিওয়ার্ড ব্যবহার করে কাজে লাগানো যায়।
উদাহরণ:
math.js:
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
main.js:
import { add, subtract } from './math.js';
console.log(add(2, 3)); // 5
9. Promises
Promises ES6 এ এসেছে, যা অ্যাসিঙ্ক্রোনাস কোডে ব্যবহৃত হয় এবং কলব্যাক হেল্প থেকে মুক্তি দেয়। এটি অ্যাসিঙ্ক্রোনাস অপারেশন সম্পন্ন হলে ফলাফল দেয়।
উদাহরণ:
const myPromise = new Promise((resolve, reject) => {
const success = true;
if(success) {
resolve("Operation Successful");
} else {
reject("Operation Failed");
}
});
myPromise
.then(result => console.log(result)) // "Operation Successful"
.catch(error => console.log(error)); // "Operation Failed" (যদি reject হয়)
10. Iterators এবং For...of লুপ
ES6 এ for...of লুপ যুক্ত করা হয়েছে, যা অ্যারে বা iterable অবজেক্টের প্রতিটি উপাদান সহজে অ্যাক্সেস করতে সহায়তা করে।
উদাহরণ:
const numbers = [1, 2, 3];
for (const num of numbers) {
console.log(num); // 1, 2, 3
}
এসব ES6 এর নতুন বৈশিষ্ট্যগুলো কোড লেখার অভিজ্ঞতাকে আরও উন্নত এবং কার্যকর করে তোলে, যাতে কোড কমপ্যাক্ট, দ্রুত এবং পাঠযোগ্য হয়।
ES6 এর Arrow Functions এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হলো, this এর আচরণ। সাধারণ ফাংশনের তুলনায় Arrow Functions এ this এর আচরণ কিছুটা আলাদা। Arrow Functions এ this এর মান লেক্সিক্যালি নির্ধারিত হয়, অর্থাৎ যে স্কোপে ফাংশনটি ডিফাইন করা হয়, সেই স্কোপের this ভ্যালু Arrow Function এর মধ্যে ব্যবহৃত হবে। সাধারণ ফাংশনে, this ফাংশনটির কলিং কনটেক্সটের উপর নির্ভর করে পরিবর্তিত হয়।
এখানে Arrow Functions এবং সাধারণ ফাংশনের মধ্যে this এর ব্যবহার সম্পর্কিত পার্থক্যগুলো বিশ্লেষণ করা হলো।
1. সাধারণ ফাংশন এবং this এর ব্যবহার
সাধারণ ফাংশন ব্যবহার করার সময়, this শব্দটি ডাইনামিকভাবে কলিং কনটেক্সট অনুসারে নির্ধারিত হয়। এর মানে হলো, যেখান থেকে ফাংশনটি কল করা হচ্ছে, সেখানে this পরিবর্তিত হবে।
উদাহরণ (সাধারণ ফাংশন):
const person = {
name: "John",
greet: function() {
console.log(this.name); // `this` refers to the `person` object
}
};
person.greet(); // "John"
এখানে, greet ফাংশনে this person অবজেক্টকে রেফার করে, কারণ এটি person.greet() হিসেবে কল করা হয়েছে।
2. Arrow Function এবং this এর ব্যবহার
Arrow Functions এ this এর মান লেক্সিক্যাল স্কোপিং অনুসরণ করে, অর্থাৎ Arrow Function যেখানে ডিফাইন করা হয়, সেখানে this এর মান নির্ধারিত হয়। এটি সাধারণ ফাংশনের মতো ডাইনামিক নয়, তাই Arrow Function এ this কখনও পরিবর্তিত হয় না। Arrow Function এর this মূলত তার বাইরের স্কোপ থেকে আসা মানকে ধরে রাখে।
উদাহরণ (Arrow Function):
const person = {
name: "John",
greet: function() {
setTimeout(() => {
console.log(this.name); // `this` refers to the `person` object due to lexical scoping
}, 1000);
}
};
person.greet(); // "John" after 1 second
এখানে, Arrow Function এ this person অবজেক্টের this কে রেফার করছে, কারণ Arrow Function লেক্সিক্যালি সেই this স্কোপের সাথে সম্পর্কিত।
3. this এর ব্যবহার setTimeout এবং setInterval এর সাথে
একটি প্রচলিত সমস্যা যা সাধারন ফাংশনে this ব্যবহারের সময় দেখা দেয় তা হল setTimeout বা setInterval এর মধ্যে this এর আচরণ। সাধারণ ফাংশনে, this setTimeout এর মধ্যে ফাংশন কল করার সময় পরিবর্তিত হতে পারে, কিন্তু Arrow Functions এ this তার বাইরের স্কোপের this ভ্যালুই ধরে রাখে।
উদাহরণ (সাধারণ ফাংশন):
const person = {
name: "John",
greet: function() {
setTimeout(function() {
console.log(this.name); // `this` refers to the global object or `undefined` in strict mode
}, 1000);
}
};
person.greet(); // undefined or Error: Cannot read property 'name' of undefined
এখানে, setTimeout এর ভিতরের সাধারণ ফাংশনটি this কে ডাইনামিকভাবে আপডেট করে, তাই এটি window (গ্লোবাল অবজেক্ট) বা undefined রেফার করবে, এবং তাতে name প্রপার্টি পাওয়া যাবে না।
উদাহরণ (Arrow Function):
const person = {
name: "John",
greet: function() {
setTimeout(() => {
console.log(this.name); // `this` refers to the `person` object
}, 1000);
}
};
person.greet(); // "John" after 1 second
এখানে, Arrow Function this এর মান person অবজেক্ট থেকে নেবে, এবং তাই সঠিকভাবে "John" প্রিন্ট হবে।
4. this এর ব্যবহার Callback Functions এ
Arrow Functions this এর আচরণে একাধিক সুবিধা দেয়, বিশেষ করে কলব্যাক ফাংশনের ক্ষেত্রে। সাধারণ ফাংশন ব্যবহারের ক্ষেত্রে, কলব্যাক ফাংশনে this পরিবর্তিত হতে পারে, কিন্তু Arrow Functions এ this এর মান বাইরের স্কোপের সাথে সম্পর্কিত থাকে।
উদাহরণ (Callback Function - সাধারণ ফাংশন):
function Timer() {
this.seconds = 0;
setInterval(function() {
this.seconds++; // `this` refers to the global object or `undefined` in strict mode
console.log(this.seconds);
}, 1000);
}
const timer = new Timer(); // Error: Cannot read property 'seconds' of undefined
এখানে, setInterval এর মধ্যে this এর মান পরিবর্তিত হচ্ছে, তাই this.seconds অ্যাক্সেস করা যাবে না।
উদাহরণ (Callback Function - Arrow Function):
function Timer() {
this.seconds = 0;
setInterval(() => {
this.seconds++; // `this` refers to the `Timer` object
console.log(this.seconds);
}, 1000);
}
const timer = new Timer(); // Correctly increments seconds
এখানে, Arrow Function ব্যবহার করা হলে this যথাযথভাবে Timer অবজেক্টের সাথে সম্পর্কিত থাকে, এবং কোড সঠিকভাবে কাজ করবে।
- Arrow Functions এ
thisএর মান লেক্সিক্যালভাবে নির্ধারিত হয়, অর্থাৎ যেখানে ফাংশনটি ডিফাইন করা হয়, সেখানকারthisমান Arrow Function এ ব্যবহৃত হয়। - সাধারণ ফাংশনে
thisকলিং কনটেক্সট অনুযায়ী পরিবর্তিত হয়, এবং এটিthisকে নতুন স্কোপে প্রোপাগেট করে। - Arrow Functions এর মাধ্যমে কলব্যাক এবং অ্যাসিঙ্ক্রোনাস কাজের ক্ষেত্রে
thisএর আচরণ সহজে পরিচালনা করা যায়।
Arrow Functions এর মাধ্যমে কোড আরো পরিষ্কার, সংক্ষিপ্ত এবং উন্নত হয়ে উঠে, বিশেষত যখন ফাংশনের ভিতরে this ব্যবহারের প্রয়োজন হয়।
Read more