जावास्क्रिप्ट में "=>" (बराबरी और उससे अधिक से बना एक तीर) का अर्थ क्या है?


444

मुझे पता है कि >=ऑपरेटर का मतलब इससे अधिक या उसके बराबर है, लेकिन मैंने =>कुछ स्रोत कोड में देखा है। उस ऑपरेटर का मतलब क्या है?

यहाँ कोड है:

promiseTargetFile(fpParams, aSkipPrompt, relatedURI).then(aDialogAccepted => {
    if (!aDialogAccepted)
        return;

    saveAsType = fpParams.saveAsType;
    file = fpParams.file;

    continueSave();
}).then(null, Components.utils.reportError);

5
तीर के कार्यों के बारे में यह लिंक देखें ।
मिस्टालिस

जवाबों:


546

यह क्या है

यह एक एरो फंक्शन है। एरो फ़ंक्शंस एक छोटा वाक्यविन्यास है, जिसे ECMAscript 6 द्वारा पेश किया गया है, जिसका उपयोग उसी तरह किया जा सकता है जिस तरह से आप फ़ंक्शन अभिव्यक्तियों का उपयोग करेंगे। दूसरे शब्दों में, आप अक्सर अभिव्यक्तियों की जगह उनका उपयोग कर सकते हैं function (foo) {...}। लेकिन उनके कुछ महत्वपूर्ण अंतर हैं। उदाहरण के लिए, वे अपने स्वयं के मूल्यों को नहीं बांधते हैं this(चर्चा के लिए नीचे देखें)।

एरो फ़ंक्शंस ECMAscript 6 विनिर्देश का हिस्सा हैं। वे अभी तक सभी ब्राउज़रों में समर्थित नहीं हैं, लेकिन वे आंशिक रूप से या पूरी तरह से नोड v। 4.0+ और 2018 तक उपयोग में आने वाले अधिकांश आधुनिक ब्राउज़रों में समर्थित हैं (मैंने नीचे दिए गए समर्थन ब्राउज़रों की एक आंशिक सूची शामिल की है)।

आप तीर के कार्यों पर मोज़िला प्रलेखन में अधिक पढ़ सकते हैं

मोज़िला दस्तावेज़ से:

एक तीर समारोह अभिव्यक्ति (यह भी वसा तीर समारोह के रूप में जाना जाता है) की तुलना में एक छोटे वाक्य रचना है समारोह भाव और lexically बांधता thisमूल्य (बाँध नहीं है अपने आप ही this, arguments, super, या new.target)। एरो फ़ंक्शंस हमेशा गुमनाम होते हैं। ये फ़ंक्शन अभिव्यक्तियाँ गैर-विधि कार्यों के लिए सबसे उपयुक्त हैं और इन्हें कंस्ट्रक्टर के रूप में उपयोग नहीं किया जा सकता है।

thisएरो फंक्शंस में काम करता है पर एक नोट

तीर फ़ंक्शन की सबसे उपयोगी विशेषताओं में से एक को ऊपर पाठ में दफन किया गया है:

एक एरो फंक्शन ... लेक्सिकली thisवैल्यू को बांधता है (अपना खुद का बाइंड नहीं करता this...)

सरल शब्दों में इसका मतलब यह है कि तीर फ़ंक्शन thisअपने संदर्भ से मूल्य को बनाए रखता है और इसका अपना नहीं है this। एक पारंपरिक फ़ंक्शन अपने स्वयं के मूल्य को बाँध सकता हैthis , यह इस बात पर निर्भर करता है कि इसे कैसे परिभाषित और कहा जाता है। इसके self = this;लिए thisकिसी अन्य फ़ंक्शन के अंदर एक फ़ंक्शन से पहुंचने या हेरफेर करने के लिए बहुत सारे जिमनास्टिक जैसे , आदि की आवश्यकता हो सकती है । इस विषय पर अधिक जानकारी के लिए, मोज़िला प्रलेखन में स्पष्टीकरण और उदाहरण देखें ।

उदाहरण कोड

उदाहरण (डॉक्स से भी):

var a = [
  "We're up all night 'til the sun",
  "We're up all night to get some",
  "We're up all night for good fun",
  "We're up all night to get lucky"
];

// These two assignments are equivalent:

// Old-school:
var a2 = a.map(function(s){ return s.length });

// ECMAscript 6 using arrow functions
var a3 = a.map( s => s.length );

// both a2 and a3 will be equal to [31, 30, 31, 31]

संगतता पर नोट्स

आप नोड फ़ंक्शन में तीर फ़ंक्शन का उपयोग कर सकते हैं, लेकिन ब्राउज़र समर्थन धब्बेदार है।

इस कार्यक्षमता के लिए ब्राउज़र समर्थन में काफी सुधार हुआ है, लेकिन यह अभी भी अधिकांश ब्राउज़र-आधारित उपयोगों के लिए पर्याप्त व्यापक नहीं है। 12 दिसंबर, 2017 तक, यह वर्तमान संस्करणों में समर्थित है:

  • Chrome (v। 45+)
  • फ़ायरफ़ॉक्स (v। 22+)
  • एज (v। 12+)
  • ओपेरा (v। 32+)
  • Android ब्राउज़र (v। 47+)
  • ओपेरा मोबाइल (v। 33+)
  • Android के लिए Chrome (v। 47+)
  • Android के लिए फ़ायरफ़ॉक्स (v। 44+)
  • सफ़ारी (v। 10+)
  • iOS सफारी (v। 10.2+)
  • सैमसंग इंटरनेट (v। 5+)
  • Baidu ब्राउज़र (v। 7.12+)

इसमें समर्थित नहीं:

  • IE (वी। 11 के माध्यम से)
  • ओपेरा मिनी (वी। 8.0 के माध्यम से)
  • ब्लैकबेरी ब्राउज़र (वी 10 के माध्यम से)
  • IE मोबाइल (v। 11 के माध्यम से)
  • Android के लिए यूसी ब्राउज़र (वी। 11.4 के माध्यम से)
  • QQ (v। 1.2 के माध्यम से)

आप CanIUse.com (कोई संबद्धता) पर अधिक (और अधिक वर्तमान) जानकारी पा सकते हैं ।


3
टाइपस्क्रिप्ट भी इसका समर्थन करते हैं।
mtyson

1
ऐसा लगता है कि यह एक लंबोदर अभिव्यक्ति है, हाँ?
Addem

1
ब्राउज़र संगतता के संदर्भ में उल्लेख करना चाहता था, मैं ईएस 6 / ईएस 7 एरो फ़ंक्शंस और अन्य सुविधाओं का उपयोग करता है जो आईई 11 के मूल रूप से संगत नहीं हैं, लेकिन मैं ईएस 6 को ईएस 5 से ट्रांसपाइल करने के लिए बबेल के साथ गुल्प या वेबपैक का उपयोग करता हूं इसलिए यह आईई 11 में काम करता है। इसलिए यदि आपको IE11 समर्थन की आवश्यकता है और आपको बैबेल सेट करने में कोई आपत्ति नहीं है तो इसके लिए जाएं।
mbokil

76

यह एक एरो फंक्शन के रूप में जाना जाता है, जो कि ECMAScript 2015 का हिस्सा है ...

var foo = ['a', 'ab', 'abc'];

var bar = foo.map(f => f.length);

console.log(bar); // 1,2,3

पिछले की तुलना में छोटा सिंटैक्स:

// < ES6:
var foo = ['a', 'ab', 'abc'];

var bar = foo.map(function(f) {
  return f.length;
});
console.log(bar); // 1,2,3

डेमो

दूसरी भयानक बात है शाब्दिक this ... आमतौर पर, आप कुछ ऐसा करेंगे:

function Foo() {
  this.name = name;
  this.count = 0;
  this.startCounting();
}

Foo.prototype.startCounting = function() {
  var self = this;
  setInterval(function() {
    // this is the Window, not Foo {}, as you might expect
    console.log(this); // [object Window]
    // that's why we reassign this to self before setInterval()
    console.log(self.count);
    self.count++;
  }, 1000)
}

new Foo();

लेकिन इस तरह से तीर के साथ फिर से लिखा जा सकता है:

function Foo() {
  this.name = name;
  this.count = 0;
  this.startCounting();
}

Foo.prototype.startCounting = function() {
  setInterval(() => {
    console.log(this); // [object Object]
    console.log(this.count); // 1, 2, 3
    this.count++;
  }, 1000)
}

new Foo();

डेमो

सिंटैक्स पर एमडीएन
मोर

अधिक जानकारी के लिए, यहाँ है के लिए एक बहुत अच्छी जवाब जब तीर कार्यों का उपयोग करने के लिए।


इसका इस्तेमाल करने की क़ौम अद्यतन करने के लिए अच्छा होगा esfiddle.net रूप es6fiddle.net नहीं रह गया काम कर रही है
Wavesailor

25

यह ECMAScript 6 में पेश किया गया "एरो फंक्शन एक्सप्रेशन" होगा।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/arrow_functions

ऐतिहासिक उद्देश्यों के लिए (यदि विकी पृष्ठ बाद में बदल जाता है), यह है:

एरो फंक्शन एक्सप्रेशन में फंक्शन एक्सप्रेशंस की तुलना में छोटा सिंटैक्स होता है और लेक्सिकली इस वैल्यू को बांधता है। एरो फ़ंक्शंस हमेशा गुमनाम होते हैं।


1
पर्याप्त जानकारी सहित अधिकांश पाठकों को नीचे ड्रिल करने की आवश्यकता नहीं है?
djechlin

2
जिस विकी को मैंने बहुत ही सूक्ष्मता से जोड़ा है वह बताता है कि यह क्या है: "एक एरो फंक्शन एक्सप्रेशन में फंक्शन एक्सप्रेशंस की तुलना में कम सिंटैक्स होता है और लेक्सिकली इस वैल्यू को बांधता है। एरो फ़ंक्शंस हमेशा गुमनाम होते हैं।"
काइल फाल्कनर

1
यहां एक उद्धरण के रूप में जोड़ना वास्तव में आपके उत्तर में मदद करेगा।
हैंकी पनकी

22

ये एरो फंक्शन्स हैं

जिसे फैट एरो फंक्शन्स के नाम से भी जाना जाता है । वे फंक्शन एक्सप्रेशन लिखने के लिए एक साफ और कॉन्शियस तरीका हैं, जैसे function() {}

एरो फ़ंक्शंस आवश्यकता को हटा सकते हैं function, returnऔर {}जब फ़ंक्शन को परिभाषित करते हैं। वे एक-लाइनर हैं, जावा या पायथन में लैम्ब्डा एक्सप्रेशंस के समान।

बिना मापदंडों के उदाहरण

const queue = ['Dave', 'Sarah', 'Sharon'];
const nextCustomer = () => queue[0];

console.log(nextCustomer()); // 'Dave'

यदि एक ही एरो फंक्शन के भीतर कई स्टेटमेंट्स की जरूरत है, तो आपको इस उदाहरण में, queue[0]कर्ली कोष्ठक में लपेटने की आवश्यकता है {}। इस स्थिति में रिटर्न स्टेटमेंट को छोड़ा नहीं जा सकता है।

1 पैरामीटर के साथ उदाहरण

const queue = ['Dave', 'Sarah', 'Sharon'];
const addCustomer = name => {
  queue.push(name);
};

addCustomer('Toby');

console.log(queue); // ['Dave', 'Sarah', 'Sharon', 'Toby']

आप {}ऊपर से छोड़ सकते हैं ।

जब एक एकल पैरामीटर होता है, ()तो पैरामीटर के चारों ओर के कोष्ठक को छोड़ा जा सकता है।

कई मापदंडों के साथ उदाहरण

const addNumbers = (x, y) => x + y

console.log(addNumbers(1, 5)); // 6

एक उपयोगी उदाहरण

const fruits = [
    {name: 'Apple', price: 2},
    {name: 'Bananna', price: 3},
    {name: 'Pear', price: 1}
];

अगर हम चाहते थे कि ES5 में, हम हर फल की कीमत एक ही सरणी में पा सकें:

fruits.map(function(fruit) {
    return fruit.price;
}); // [2, 3, 1]

नए एरो फ़ंक्शंस के साथ ES6 में, हम इसे और अधिक संक्षिप्त बना सकते हैं:

fruits.map(fruit => fruit.price); // [2, 3, 1]

एरो फंक्शंस की अतिरिक्त जानकारी मिल सकती है यहां है

ब्राउज़र संगतता

  • IE: अभी तक समर्थित नहीं है
  • बढ़त: 12+ (सभी संस्करण)
  • फ़ायरफ़ॉक्स: 22+
  • क्रोम: 45+
  • सफारी: 10+
  • iOS सफारी: 10.2+
  • Android ब्राउज़र: 56+

अतिरिक्त अप-टू-डेट जानकारी यहां ब्राउज़र संगतता पर पाई जा सकती है


21

नक्शे का उपयोग किए बिना एक लंबोदर क्या कर सकता है इसका एक और उदाहरण जोड़ने के लिए:

a = 10
b = 2

var mixed = (a,b) => a * b; 
// OR
var mixed = (a,b) => { (any logic); return a * b };

console.log(mixed(a,b)) 
// 20

13

जैसा कि दूसरों ने कहा है, यह फ़ंक्शन बनाने के लिए एक नया वाक्यविन्यास है।

हालाँकि, इस तरह के कार्य सामान्य लोगों से भिन्न होते हैं:

  • वे thisमूल्य को बांधते हैं । के रूप में कल्पना द्वारा समझाया ,

    एक ArrowFunction के लिए स्थानीय बाइंडिंग को परिभाषित नहीं करता arguments, super, this, या new.target। किसी भी संदर्भ के लिए arguments, super, this, या new.targetएक के भीतर ArrowFunction एक lexically संलग्न वातावरण में एक बाध्यकारी दिखाई देनी चाहिए। आमतौर पर यह एक तुरंत संलग्न फ़ंक्शन का कार्य वातावरण होगा।

    भले ही एक ArrowFunction के संदर्भ हो सकते हैं super, चरण 4 में बनाई गई फ़ंक्शन ऑब्जेक्ट मेकमेथोड प्रदर्शन करके एक विधि में नहीं बनाई गई है । एक एरोफ़ंक्शन जो संदर्भ super हमेशा एक गैर- एरोफ़ंक्शन के भीतर समाहित होता है और लागू करने के लिए आवश्यक स्थिति superउस कार्य के माध्यम से पहुंच योग्य होती है जो एरोफ़ंक्शन के फ़ंक्शन ऑब्जेक्ट द्वारा कैप्चर की जाती है

  • वे गैर-निर्माता हैं।

    इसका मतलब है कि उनके पास कोई [[निर्माण]] आंतरिक विधि नहीं है, और इस तरह उन्हें तत्काल नहीं किया जा सकता है, जैसे

    var f = a => a;
    f(123);  // 123
    new f(); // TypeError: f is not a constructor

8

मैंने पढ़ा है, यह का प्रतीक Arrow FunctionsहैES6

इस

var a2 = a.map(function(s){ return s.length });

का उपयोग करते हुए Arrow Functionलिखा जा सकता है

var a3 = a.map( s => s.length );

एमडीएन डॉक्स


6

Arrowfunction के साथ सरल CRUD उदाहरण जोड़ना

 //Arrow Function
 var customers   = [
   {
     name: 'Dave',
     contact:'9192631770'
   },
   {
     name: 'Sarah',
     contact:'9192631770'
   },
   {
     name: 'Akhil',
     contact:'9928462656' 
   }],

// No Param READ
 getFirstCustomer = () => { 
   console.log(this);
   return customers[0];
 };
  console.log("First Customer "+JSON.stringify(getFirstCustomer())); // 'Dave' 

   //1 Param SEARCH
  getNthCustomer = index=>{
    if( index>customers.length)
    {
     return  "No such thing";
   }
   else{
       return customers[index];
     } 
  };
  console.log("Nth Customer is " +JSON.stringify(getNthCustomer(1))); 

   //2params ADD
  addCustomer = (name, contact)=> customers.push({
     'name': name,
     'contact':contact
    });
  addCustomer('Hitesh','8888813275');
  console.log("Added Customer "+JSON.stringify(customers)); 

  //2 param UPDATE
  updateCustomerName = (index, newName)=>{customers[index].name= newName};
  updateCustomerName(customers.length-1,"HiteshSahu");
  console.log("Updated Customer "+JSON.stringify(customers));

  //1 param DELETE
  removeCustomer = (customerToRemove) => customers.pop(customerToRemove);
  removeCustomer(getFirstCustomer());
  console.log("Removed Customer "+JSON.stringify(customers)); 

4

दूसरे उत्तरों से असंतुष्ट। 2019/3/13 के शीर्ष मतदान का उत्तर तथ्यात्मक रूप से गलत है।

=>इसका क्या अर्थ है इसका संक्षिप्त रूप संस्करण है, यह एक फ़ंक्शन लिखने और वर्तमान के लिए बाध्य करने के लिए एक शॉर्टकट हैthis

const foo = a => a * 2;

के लिए प्रभावी रूप से एक शॉर्टकट है

const foo = function(a) { return a * 2; }.bind(this);

आप उन सभी चीजों को देख सकते हैं जो छोटी हो गईं। हमें जरूरत नहीं थी function, न returnही.bind(this) और ही ब्रेसिज़ या कोष्ठक की भी

तीर फ़ंक्शन का एक लंबा लंबा उदाहरण हो सकता है

const foo = (width, height) => {
  const area = width * height;
  return area;
};

यह दिखाते हुए कि यदि हम फ़ंक्शन के लिए कई तर्क चाहते हैं, तो हमें कोष्ठकों की आवश्यकता है और यदि हम एकल अभिव्यक्ति से अधिक लिखना चाहते हैं, तो हमें एक स्पष्ट और स्पष्ट विवरण चाहिए return

.bindभाग को समझना महत्वपूर्ण है और यह एक बड़ा विषय है। यह thisजावास्क्रिप्ट में क्या मतलब है के साथ क्या करना है।

सभी कार्यों में एक अंतर्निहित पैरामीटर होता है जिसे कहा जाता है this। किस तरहthisकिसी फ़ंक्शन को कॉल करते समय सेट किया जाता है यह उस फ़ंक्शन को कैसे कहा जाता है पर निर्भर करता है।

लेना

function foo() { console.log(this); }

यदि आप इसे सामान्य रूप से कहते हैं

function foo() { console.log(this); }
foo();

this वैश्विक वस्तु होगी।

यदि आप सख्त मोड में हैं

`use strict`;
function foo() { console.log(this); }
foo();

// or

function foo() {
   `use strict`;
   console.log(this);
 }
foo();

यह undefined

आप thisसीधे callया का उपयोग कर सेट कर सकते हैंapply

function foo(msg) { console.log(msg, this); }

const obj1 = {abc: 123}
const obj2 = {def: 456}

foo.call(obj1, 'hello');  // prints Hello {abc: 123}
foo.apply(obj2, ['hi']);  // prints Hi {def: 456}

आप thisबिंदी ऑपरेटर के उपयोग से भी निर्धारित कर सकते हैं.

function foo(msg) { console.log(msg, this); }
const obj = {
   abc: 123,
   bar: foo,
}
obj.bar('Hola');  // prints Hola {abc:123, bar: f}

एक समस्या तब आती है जब आप किसी फ़ंक्शन को कॉलबैक या श्रोता के रूप में उपयोग करना चाहते हैं। आप क्लास बनाते हैं और कॉलबैक के रूप में एक फ़ंक्शन असाइन करना चाहते हैं जो क्लास का एक उदाहरण एक्सेस करता है।

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click', function() {
       console.log(this.name);  // won't work
    }); 
  }
}

उपरोक्त कोड काम नहीं करेगा क्योंकि जब तत्व ईवेंट को फायर करता है और फ़ंक्शन को कॉल करता है this मूल्य वर्ग का उदाहरण नहीं होगा।

उस समस्या को हल करने का एक सामान्य तरीका उपयोग करना है .bind

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click', function() {
       console.log(this.name); 
    }.bind(this); // <=========== ADDED! ===========
  }
}

क्योंकि एरो सिंटैक्स वही काम करता है जो हम लिख सकते हैं

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click',() => {
       console.log(this.name); 
    });
  }
}

bindप्रभावी ढंग से एक नया कार्य करता है । यदि bindमौजूद नहीं था तो आप मूल रूप से इस तरह से अपना खुद का बना सकते हैं

function bind(funcitonToBind, valueToUseForThis) {
  return function(...args) {
    functionToBind.call(valueToUseForThis, ...args);
  };
}

प्रसार ऑपरेटर के बिना पुराने जावास्क्रिप्ट में यह होगा

function bind(funcitonToBind, valueToUseForThis) {
  return function() {
    functionToBind.apply(valueToUseForThis, arguments);
  };
}

उस कोड को समझना क्लोजर की समझ की आवश्यकता है , लेकिन लघु संस्करण bindएक नया फ़ंक्शन बनाता है जो मूल फ़ंक्शन को हमेशा उस thisमूल्य के साथ कॉल करता है जो इसके लिए बाध्य था। एरो फंक्शन वही काम करते हैं क्योंकि वे एक शॉर्टकट हैंbind(this)


2

जैसा कि अन्य सभी उत्तर पहले ही कह चुके हैं, यह ES2015 तीर फ़ंक्शन सिंटैक्स का हिस्सा है। विशेष रूप से, यह एक ऑपरेटर नहीं है, यह एक पंचर टोकन है जो शरीर से मापदंडों को अलग करता है ArrowFunction : ArrowParameters => ConciseBody:। जैसे (params) => { /* body */ }


1

ES6 तीर कार्य:

जावास्क्रिप्ट =>में एक एरो फंक्शन एक्सप्रेशन का प्रतीक है। एक एरो फंक्शन एक्सप्रेशन का अपना कोई thisबंधन नहीं होता है और इसलिए इसे कंस्ट्रक्टर फ़ंक्शन के रूप में उपयोग नहीं किया जा सकता है। उदाहरण के लिए:

var words = 'hi from outside object';

let obj = {
  words: 'hi from inside object',
  talk1: () => {console.log(this.words)},
  talk2: function () {console.log(this.words)}
}

obj.talk1();  // doesn't have its own this binding, this === window
obj.talk2();  // does have its own this binding, this is obj

तीर फ़ंक्शंस का उपयोग करने के नियम:

  • यदि वास्तव में एक तर्क है तो आप तर्क के कोष्ठकों को छोड़ सकते हैं।
  • यदि आप एक अभिव्यक्ति वापस करते हैं और एक ही पंक्ति पर ऐसा करते हैं तो आप {}और returnकथन को छोड़ सकते हैं

उदाहरण के लिए:

let times2 = val => val * 2;  
// It is on the same line and returns an expression therefore the {} are ommited and the expression returns implictly
// there also is only one argument, therefore the parentheses around the argument are omitted

console.log(times2(3));


1

एरो फ़ंक्शंस जिन्हें प्रतीक (=>) द्वारा दर्शाया गया है, आपको अनाम फ़ंक्शंस और तरीके बनाने में मदद करता है। यह अधिक छोटे वाक्यविन्यास की ओर जाता है। उदाहरण के लिए, नीचे एक सरल "ऐड" फ़ंक्शन है जो दो संख्याओं को जोड़ देता है।

function Add(num1 , num2 ){
return num1 + num2;
}

उपरोक्त फ़ंक्शन "एरो" सिंटैक्स का उपयोग करके छोटा हो जाता है जैसा कि नीचे दिखाया गया है।

यहां छवि विवरण दर्ज करें

उपरोक्त कोड के दो भाग हैं जैसा कि ऊपर चित्र में दिखाया गया है: -

इनपुट: - यह खंड अनाम फ़ंक्शन के इनपुट मापदंडों को निर्दिष्ट करता है।

लॉजिक: - यह सेक्शन "=>" सिंबल के बाद आता है। इस अनुभाग में वास्तविक फ़ंक्शन का तर्क है।

कई डेवलपर्स सोचते हैं कि तीर फ़ंक्शन आपके सिंटैक्स को छोटा, सरल बनाता है और इस प्रकार आपके कोड को पठनीय बनाता है।

यदि आप उपरोक्त वाक्य को मानते हैं, तो मुझे विश्वास दिलाएं कि यह एक मिथक है। यदि आप एक पल के लिए सोचते हैं कि नाम के साथ एक सही ढंग से लिखा गया फ़ंक्शन एक तीर के प्रतीक का उपयोग करके एक पंक्ति में बनाई गई गूढ़ कार्यों की तुलना में बहुत अधिक पठनीय है।

तीर फ़ंक्शन का मुख्य उपयोग यह सुनिश्चित करना है कि कोड कॉलर्स संदर्भ में चलता है।

नीचे दिए गए कोड को देखें जिसमें एक वैश्विक चर "संदर्भ" परिभाषित है, यह वैश्विक चर एक फ़ंक्शन "SomeOtherMethod" के अंदर पहुंचता है जिसे अन्य विधि "SomeMethod" से कहा जाता है।

इस "SomeMethod" में स्थानीय "संदर्भ" चर है। अब क्योंकि "SomeOtherMethod" को "SomeMethod" कहा जाता है, हम उम्मीद करते हैं कि यह "स्थानीय संदर्भ" प्रदर्शित करेगा, लेकिन यह "वैश्विक संदर्भ" प्रदर्शित करता है।

var context = global context”;

function SomeOtherMethod(){
alert(this.context);
}

function SomeMethod(){
this.context = local context”;
SomeOtherMethod();
}

var instance = new SomeMethod();

लेकिन अगर एरो फ़ंक्शन का उपयोग करके कॉल को प्रतिस्थापित करें तो यह "स्थानीय संदर्भ" प्रदर्शित करेगा।

var context = "global context";

    function SomeMethod(){
        this.context = "local context";
        SomeOtherMethod = () => {
            alert(this.context);
        }
        SomeOtherMethod();
    }
    var instance = new SomeMethod();

मैं आपको इस लिंक ( जावास्क्रिप्ट में एरो फ़ंक्शन) को पढ़ने के लिए प्रोत्साहित करूंगा ) जो जावास्क्रिप्ट संदर्भ के सभी परिदृश्यों की व्याख्या करता है और जिन स्थितियों में कॉलर्स संदर्भ का सम्मान नहीं किया जाता है।

आप इस youtube वीडियो में जावास्क्रिप्ट के साथ ऐरो फ़ंक्शन के प्रदर्शन को भी देख सकते हैं जो व्यावहारिक रूप से प्रसंग शब्द को प्रदर्शित करता है।


0

जैसा कि दूसरों ने कहा है, नियमित (पारंपरिक) फ़ंक्शन फ़ंक्शन thisनामक ऑब्जेक्ट से उपयोग करते हैं, (उदाहरण के लिए एक बटन जिसे क्लिक किया गया था) । इसके बजाय, तीर फ़ंक्शन thisउस फ़ंक्शन से उपयोग होता है जो फ़ंक्शन को परिभाषित करता है।

दो समान कार्यों पर विचार करें:

regular = function() {
  ' Identical Part Here;
}


arrow = () => {
  ' Identical Part Here;
}

नीचे दिया गया स्निपेट thisप्रत्येक फ़ंक्शन के लिए जो प्रतिनिधित्व करता है, उसके बीच मूलभूत अंतर को दर्शाता है । नियमित रूप से समारोह आउटपुट [object HTMLButtonElement]जबकि तीर समारोह आउटपुट [object Window]

<html>
 <button id="btn1">Regular: `this` comes from "this button"</button>
 <br><br>
 <button id="btn2">Arrow: `this` comes from object that defines the function</button>
 <p id="res"/>

 <script>
  regular = function() {
    document.getElementById("res").innerHTML = this;
  }

  arrow = () => {
    document.getElementById("res").innerHTML = this;
  }

  document.getElementById("btn1").addEventListener("click", regular);
  document.getElementById("btn2").addEventListener("click", arrow);
 </script>
</html>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.