tl; dr: না! তীর ফাংশন এবং ফাংশন ঘোষণা / এক্সপ্রেশন সমতুল্য নয় এবং অন্ধভাবে প্রতিস্থাপন করা যায় না।
যদি ফাংশন আপনি প্রতিস্থাপন করতে না চান না ব্যবহার this
, arguments
এবং বলা হয় না new
, তারপর হ্যাঁ।
যেমন প্রায়ই: এটি নির্ভর করে । ফাংশন ঘোষণার / এক্সপ্রেশনগুলির চেয়ে তীরের ক্রিয়াকলাপগুলির ভিন্ন আচরণ থাকে, তাই আসুন প্রথমে তফাতগুলি একবার দেখি:
1. লেক্সিকাল this
এবংarguments
তীর ফাংশনগুলির নিজস্ব this
বা arguments
বাঁধাই নেই। পরিবর্তে, identif শনাক্তকারীদের অন্যান্য ভেরিয়েবলের মতো লেজিকাল স্কোপে সমাধান করা হয়। তার মানে তাদের একটি তীর ফাংশন ভিতরে, this
এবং arguments
মান পড়ুন this
এবং arguments
পরিবেশ তীর ফাংশন হয় সংজ্ঞায়িত (অর্থাত তীর ফাংশন "বাহিরে") মধ্যে:
// Example using a function expression
function createObject() {
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: function() {
console.log('Inside `bar`:', this.foo);
},
};
}
createObject.call({foo: 21}).bar(); // override `this` inside createObject
// Example using a arrow function
function createObject() {
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: () => console.log('Inside `bar`:', this.foo),
};
}
createObject.call({foo: 21}).bar(); // override `this` inside createObject
ফাংশন এক্সপ্রেশন ক্ষেত্রে, এর this
ভিতরে তৈরি হওয়া অবজেক্টটিকে বোঝায় createObject
। তীর ফাংশন ক্ষেত্রে, this
বোঝায় this
এর createObject
নিজেই।
this
আপনার বর্তমান পরিবেশের অ্যাক্সেসের প্রয়োজন হলে এটি তীর ফাংশনকে দরকারী করে তোলে :
// currently common pattern
var that = this;
getData(function(data) {
that.data = data;
});
// better alternative with arrow functions
getData(data => {
this.data = data;
});
নোট এই মানে হল যে যে না সম্ভব সেট করতে একটি তীর ফাংশনের this
সঙ্গে .bind
বা .call
।
আপনি যদি খুব পরিচিত না হন তবে this
পড়া বিবেচনা করুন
2. তীর ফাংশন সহ কল করা যাবে না new
ES2015 ফাংশন যে মধ্যে পার্থক্য কল সক্ষম এবং ফাংশন যে গঠন করা সক্ষম। যদি কোনও ফাংশন কনস্ট্রাকটেবল হয় তবে এটি দিয়ে ডাকা যেতে পারে new
, অর্থাত্ new User()
। যদি কোনও ফাংশন কলযোগ্য হয় তবে এটিকে new
(যেমন সাধারণ ফাংশন কল) ছাড়াই কল করা যায়।
ফাংশন ঘোষণার / এক্সপ্রেশনগুলির মাধ্যমে তৈরি ফাংশনগুলি গঠনমূলক এবং কলযোগ্য উভয়ই।
তীর ফাংশন (এবং পদ্ধতি) কেবল কলযোগ্য।
class
কনস্ট্রাক্টর কেবল কনস্ট্রাকটেবল।
আপনি যদি কল-নাযোগ্য ফাংশনটি কল করতে বা অ-কনস্ট্রাক্টেবল ফাংশন নির্মাণের চেষ্টা করছেন, আপনি রানটাইম ত্রুটি পাবেন।
এটি জেনে, আমরা নিম্নলিখিতটি বর্ণনা করতে পারি।
পরিবর্তনযোগ্য:
- যে কাজগুলি ব্যবহার করে না
this
বা arguments
।
- ফাংশন যা ব্যবহার করা হয়
.bind(this)
প্রতিস্থাপনযোগ্য নয় :
- কনস্ট্রাক্টর ফাংশন
- একটি প্রোটোটাইপে ফাংশন / পদ্ধতি যুক্ত করা হয়েছে (কারণ তারা সাধারণত ব্যবহার করে
this
)
- ভারিয়াদিক ফাংশন (যদি তারা ব্যবহার করে
arguments
(নীচে দেখুন))
আপনার উদাহরণগুলি ব্যবহার করে এটি ঘনিষ্ঠভাবে দেখে নেওয়া যাক:
কনস্ট্রাক্টর ফাংশন
এটি কাজ করবে না কারণ তীর ফাংশনগুলি কল করা যায় না new
। কোনও ফাংশন ডিক্লেয়ারেশন / এক্সপ্রেশন বা ব্যবহার ব্যবহার চালিয়ে যান class
।
প্রোটোটাইপ পদ্ধতি
সম্ভবত না, কারণ প্রোটোটাইপ পদ্ধতিগুলি this
উদাহরণটি অ্যাক্সেস করতে সাধারণত ব্যবহার করে। যদি তারা ব্যবহার না করে this
তবে আপনি এটি প্রতিস্থাপন করতে পারেন। তবে, আপনি যদি প্রাথমিকভাবে সংক্ষিপ্ত সিনট্যাক্সের যত্ন নেন তবে class
এর সংক্ষিপ্ত পদ্ধতির বাক্য গঠন ব্যবহার করুন:
class User {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
অবজেক্টের পদ্ধতিগুলি
আক্ষরিকভাবে কোনও অবজেক্টের পদ্ধতিগুলির জন্য। পদ্ধতিটি যদি তার মাধ্যমে অবজেক্টটিকে নিজেই উল্লেখ করতে চায় তবে this
ফাংশন এক্সপ্রেশনগুলি ব্যবহার করা চালিয়ে যান, বা নতুন পদ্ধতি সিনট্যাক্স ব্যবহার করুন:
const obj = {
getName() {
// ...
},
};
Callbacks
এটা নির্ভর করে. আপনি যদি বাইরের অংশটিকে অ্যালিজ করছেন this
বা ব্যবহার করছেন তবে আপনার অবশ্যই এটি প্রতিস্থাপন করা উচিত .bind(this)
:
// old
setTimeout(function() {
// ...
}.bind(this), 500);
// new
setTimeout(() => {
// ...
}, 500);
তবে: কলব্যাক কলকারী কোডটি যদি স্পষ্টভাবে this
নির্দিষ্ট মানকে সেট করে, যেমন ইভেন্ট হ্যান্ডলারের ক্ষেত্রে, বিশেষত jQuery এর ক্ষেত্রে এবং কলব্যাক ব্যবহার করে this
(বা arguments
), আপনি একটি তীর ফাংশন ব্যবহার করতে পারবেন না !
ভারিয়াদিক ফাংশন
যেহেতু তীর ফাংশনগুলির নিজস্ব নেই arguments
, আপনি কেবল একটি তীর ফাংশন দিয়ে তাদের প্রতিস্থাপন করতে পারবেন না। তবে, ES2015 ব্যবহারের একটি বিকল্পের পরিচয় করিয়ে দিয়েছে arguments
: বাকী প্যারামিটার ।
// old
function sum() {
let args = [].slice.call(arguments);
// ...
}
// new
const sum = (...args) => {
// ...
};
সম্পর্কিত প্রশ্ন:
আরও সংস্থানগুলি: