निम्नलिखित कोड देखें:
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
और चाइल्ड फंक्शन।
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);
}
})