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