खोज…


साधारण वस्तुओं के साथ

var person = {
  name: 'John Doe',
  age: 42,
  gender: 'male',
  bio: function() {
    console.log('My name is ' + this.name);
  }
};
person.bio(); // logs "My name is John Doe"
var bio = person.bio;
bio(); // logs "My name is undefined"

उपरोक्त कोड में, person.bio संदर्भ का उपयोग करता है ( this )। जब फ़ंक्शन को person.bio() रूप में कहा जाता है, तो संदर्भ स्वचालित रूप से पास हो जाता है, और इसलिए यह "मेरा नाम जॉन डो है" सही ढंग से लॉग करता है। फ़ंक्शन को किसी वैरिएबल पर असाइन करते समय, यह अपना संदर्भ खो देता है।

गैर-सख्त मोड में, डिफ़ॉल्ट संदर्भ वैश्विक ऑब्जेक्ट ( window ) है। सख्त मोड में यह undefined

नेस्टेड फ़ंक्शन / ऑब्जेक्ट में उपयोग के लिए इसे सहेजना

एक सामान्य नुकसान this कि this एक नेस्टेड फ़ंक्शन या ऑब्जेक्ट में उपयोग करने की कोशिश करता है, जहां संदर्भ खो गया है।

document.getElementById('myAJAXButton').onclick = function(){
    makeAJAXRequest(function(result){
      if (result) { // success
        this.className = 'success';
      }
    })
}

यहां संदर्भ ( this ) आंतरिक कॉलबैक फ़ंक्शन में खो जाता है। इसे ठीक करने के लिए, आप के मान को बचा सकता है this एक चर में:

document.getElementById('myAJAXButton').onclick = function(){
    var self = this;
    makeAJAXRequest(function(result){
      if (result) { // success
        self.className = 'success';
      }
    })
}
6

ES6 ने एरो फ़ंक्शंस पेश किए, जिसमें this बंधन को लेक्सिकल शामिल किया गया है। उपरोक्त उदाहरण इस तरह लिखा जा सकता है:

document.getElementById('myAJAXButton').onclick = function(){
    makeAJAXRequest(result => {
      if (result) { // success
        this.className = 'success';
      }
    })
}

बंधन समारोह संदर्भ

5.1

प्रत्येक फ़ंक्शन में एक bind विधि होती है, जो एक लिपटे फ़ंक्शन का निर्माण करेगी जो इसे सही संदर्भ के साथ बुलाएगी। अधिक जानकारी के लिए यहाँ देखें।

var monitor = {
  threshold: 5,
  check: function(value) {
    if (value > this.threshold) {
      this.display("Value is too high!");
    }
  },
  display(message) {
    alert(message);
  }
};

monitor.check(7); // The value of `this` is implied by the method call syntax.


var badCheck = monitor.check;
badCheck(15); // The value of `this` is window object and this.threshold is undefined, so value > this.threshold is false

var check = monitor.check.bind(monitor);
check(15); // This value of `this` was explicitly bound, the function works.

var check8 = monitor.check.bind(monitor, 8);
check8(); // We also bound the argument to `8` here. It can't be re-specified.

कठिन बंधन

  • बंधन मुश्किल का उद्देश्य "हार्ड" लिंक करने के लिए के लिए एक संदर्भ है this
  • लाभ: यह तब उपयोगी होता है जब आप विशेष वस्तुओं को खो जाने से बचाना चाहते हैं।
  • उदाहरण:
function Person(){
    console.log("I'm " + this.name);
}

var person0 = {name: "Stackoverflow"}
var person1 = {name: "John"};
var person2 = {name: "Doe"};
var person3 = {name: "Ala Eddine JEBALI"};

var origin = Person;
Person = function(){
    origin.call(person0);
}

Person();
//outputs: I'm Stackoverflow

Person.call(person1);
//outputs: I'm Stackoverflow


Person.apply(person2);
//outputs: I'm Stackoverflow


Person.call(person3);
//outputs: I'm Stackoverflow
  • इसलिए, जैसा कि आप ऊपर दिए गए उदाहरण में टिप्पणी कर सकते हैं, आप जो भी वस्तु व्यक्ति के पास जाते हैं, वह हमेशा person0 ऑब्जेक्ट का उपयोग करेगा : यह कठिन बाइंड है

निर्माण कार्यों में यह

एक के रूप में एक समारोह का उपयोग करते समय निर्माता , यह एक विशेष है this बंधन है, जो नव निर्मित वस्तु को संदर्भित करता है:

function Cat(name) {
  this.name = name;
  this.sound = "Meow";
}

var cat = new Cat("Tom"); // is a Cat object
cat.sound; // Returns "Meow"

var cat2 = Cat("Tom"); // is undefined -- function got executed in global context
window.name; // "Tom"
cat2.name; // error! cannot access property of undefined


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow