Q24. What is the difference between call(), apply(), and bind()?
তিনটিই this বদলায়, কিন্তু আর্গুমেন্ট নেওয়ার নিয়ম ও ফেরত দেওয়া জিনিস আলাদা।
তিনটিই Function.prototype-এর method এবং তিনটিই ফাংশনের `this` কে নির্দিষ্ট কোনো মানে বেঁধে দেয়। পার্থক্য হলো আর্গুমেন্ট কীভাবে দেওয়া হয় এবং ফলাফল কী ফেরত হয়।
function greet(greeting, punctuation) {
return greeting + ", " + this.name + punctuation;
}
const user = { name: "Rahim" };
// call — আর্গুমেন্ট আলাদা করে
console.log(greet.call(user, "হ্যালো", "!"));
// "হ্যালো, Rahim!"
// apply — আর্গুমেন্ট array বা arguments হিসেবে
console.log(greet.apply(user, ["হ্যালো", "!"]));
// "হ্যালো, Rahim!"
// bind — this বেঁধে রেখে নতুন ফাংশন ফেরত দেয়
const boundGreet = greet.bind(user, "হ্যালো");
console.log(boundGreet("!")); // "হ্যালো, Rahim!"ধাপে ধাপে — call ও apply ফাংশনটি সঙ্গে সঙ্গে চালায় এবং ফলত্র ফেরত দেয়, তাই console.log-এর ভিতরে লেখা যায়। আর bind চালায় না — সে শুধু this ও প্রথম কয়েকটা আর্গুমেন্ট মনে রেখে নতুন একটি ফাংশন বানিয়ে ফেরত দেয়, যেটা পরে ডাকা হয়।
Arrow function-এর নিজস্ব this নেই, তাই এদের কোনোটিই কাজ করে না।
const obj = {
name: "Rahim",
arrow: () => this.name, // this ধার করে নেয়
regular: function () {
return this.name;
},
};
console.log(obj.regular.call(obj)); // "Rahim" — কাজ করে
console.log(obj.arrow.call(obj)); // undefined — কাজ করে নাbind কোনো method হারানোর সমস্যা ঠিক করতে সবচেয়ে বেশি ব্যবহার হয় — setTimeout, event handler বা addEventListener-এ this ঠিক থাকে না।
function show() {
console.log(this.name);
}
const user = { name: "Rahim", show };
// ছাড়া দিলে this হারিয়ে যায়
setTimeout(user.show, 1000);
// bind করলে ঠিক থাকে
setTimeout(user.show.bind(user), 1000);
// arrow দিয়ে ও একই কাজ হয়
setTimeout(() => user.show(), 1000);| Method | আর্গুমেন্ট | ফলত্র | ফলাফল |
|---|---|---|---|
call | আলাদা করে | সঙ্গে সঙ্গে চালায় | ফাংশনের ফলত্র |
apply | array হিসেবে | সঙ্গে সঙ্গে চালায় | ফাংশনের ফলত্র |
bind | আলাদা করে | চালায় না | নতুন ফাংশন |
Math.max বা Array.prototype এর মতো ফাংশনে apply দিয়ে লিখলে যেকোনো ধরনের মানের সাথে কাজ করানো যায় — Math.max.apply(null, arr) লেখা হয় তার বদলে এখন Math.max(...arr) লেখা হয়।