tl; डॉ: नहीं! एरो फ़ंक्शंस और फ़ंक्शन घोषणाएं / अभिव्यक्तियाँ समतुल्य नहीं हैं और इन्हें नेत्रहीन रूप से प्रतिस्थापित नहीं किया जा सकता है।
यदि आप जिस फ़ंक्शन को बदलना चाहते हैं वह उपयोग नहीं करता है this, argumentsऔर इसके साथ नहीं बुलाया जाता है new, तो हाँ।
जैसा कि अक्सर: यह निर्भर करता है । फ़ंक्शन फ़ंक्शन / अभिव्यक्तियों की तुलना में एरो फ़ंक्शंस का व्यवहार अलग-अलग होता है, इसलिए पहले अंतरों पर एक नज़र डालते हैं:
1. लेक्सिकल thisऔरarguments
एरो फ़ंक्शंस के पास अपना thisया argumentsबाध्यकारी नहीं है। इसके बजाय, उन पहचानकर्ताओं को किसी अन्य चर की तरह शाब्दिक दायरे में हल किया जाता है। इसका मतलब है कि एक तीर फ़ंक्शन के अंदर, thisऔर पर्यावरण में और argumentsमानों को संदर्भित करता है तीर फ़ंक्शन को (यानी "बाहर" तीर ") में परिभाषित किया गया है:thisarguments
// 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() {
// ...
},
};
कॉलबैक
निर्भर करता है। यदि आप बाहरी रूप 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) => {
// ...
};
संबंधित प्रश्न:
आगे के संसाधन: