निम्नलिखित कोड देखें:

function parent(child) {
  var a = 4;
  var b = 5;
  child();
}

parent(function() {
  console.log(a + b);
})

यहाँ मुझे समझ में आता है:

ध्यान में न आया संदर्भ त्रुटि: एक परिभाषित नहीं है।

क्या ऐसा कुछ है जो मैं केवल parent फ़ंक्शन को बदलने के लिए कर सकता हूं ताकि बच्चे के फ़ंक्शन में console.log() की पहुंच a और b तक हो ताकि वह उसमें इसका संदर्भ दे सके। मार्ग?

मुझे पता है कि मैं तर्क के रूप में a और b को child में पास कर सकता हूं, लेकिन मुझे चाइल्ड फ़ंक्शन में पैरामीटर सूचीबद्ध करने की आवश्यकता नहीं है।

मैंने .call(), .apply(), और .bind() को भी देखा, लेकिन ऐसा लग रहा था कि अगर मैं this.a और this.b दोनों parent और चाइल्ड फंक्शन।

0
Partik 6 अगस्त 2019, 04:09

1 उत्तर

सबसे बढ़िया उत्तर

आप इसमें ग्लोबल्स जोड़ने के लिए window (this का संदर्भ देकर) का उपयोग कर सकते हैं, लेकिन कम से कम कहने के लिए यह विधि बहुत अच्छी नहीं है:

function parent(child) {
  var a = 4;
  var b = 5;
  this.a = a;
  this.b = b;
  child();
}

parent(function() {
  console.log(a + b);
})

एक और बदसूरत समाधान eval का उपयोग करना होगा, जिसकी मैं अनुशंसा नहीं करता:

function parent(child) {
  var a = 4;
  var b = 5;
  eval('var f = '+child);
  f();
}

parent(function() {
  console.log(a + b);
})

आप ऊपर बताए गए चर के माध्यम से गुजरने की सबसे अधिक संभावना रखते हैं:

function parent(child) {
  var a = 4;
  var b = 5;
  child(a, b);
}

parent(function(a, b) {
  console.log(a + b);
})

या, आप अपने child फ़ंक्शन को एक रैपर फ़ंक्शन में लपेट सकते हैं (यानी इसे बंद कर दें), जो आपके child() के लिए पैरामीटर a, b को स्वीकार कर सकता है। इसलिए:

function parent(child_wrapper) {
  var a = 4;
  var b = 5;
  var child = child_wrapper(a, b);
  child();
}

parent(function(a, b) { // wrapper function
  return function() { // original child function (untouched, just being returned by the wrapper function)
    console.log(a + b);
  }
})
0
Partik 8 अगस्त 2019, 09:50