मैं इस संदर्भ को किसी फ़ंक्शन में कैसे पास करूं?


213

मैंने सोचा कि यह कुछ ऐसा होगा जिसे मैं आसानी से Google कर सकता हूं, लेकिन शायद मैं सही सवाल नहीं पूछ रहा हूं ...

मैं किसी दिए गए जावास्क्रिप्ट फ़ंक्शन में "यह" कैसे सेट करता हूं?

उदाहरण के लिए, जैसे jQuery के अधिकांश कार्य जैसे:

$(selector).each(function() {
   //$(this) gives me access to whatever selector we're on
});

मैं अपने स्वयं के स्टैंडअलोन कार्यों को कैसे लिख / कॉल कर सकता हूं जिनके पास एक उपयुक्त "यह" संदर्भ है जिसे कहा जाता है? मैं jQuery का उपयोग करता हूं, इसलिए यदि ऐसा करने का कोई jQuery- विशिष्ट तरीका है, तो यह आदर्श होगा।


संभावित डुप्लिकेट: stackoverflow.com/questions/520019/…
user123444555621

मुझे पता है कि यह एक पुराना सवाल है, लेकिन यहां उतरने वाले अन्य लोगों के लिए $.proxy
बजे

जवाबों:


303

जावास्क्रिप्ट .call()और .apply()विधियाँ आपको किसी फ़ंक्शन के लिए संदर्भ सेट करने की अनुमति देती हैं ।

var myfunc = function(){
    alert(this.name);
};

var obj_a = {
    name:  "FOO"
};

var obj_b = {
    name:  "BAR!!"
};

अब आप कॉल कर सकते हैं:

myfunc.call(obj_a);

जो सचेत करेगा FOO। इधर-उधर, गुजरते obj_bवक्त सतर्क हो जाता BAR!!। के बीच का अंतर .call()और .apply()वह यह है कि .call()एक अल्पविराम अलग की गई सूची अगर आप अपने कार्य करने के लिए तर्क दे रहे लेता है और .apply()एक सरणी की जरूरत है।

myfunc.call(obj_a, 1, 2, 3);
myfunc.apply(obj_a, [1, 2, 3]);

इसलिए, आप विधि hookका उपयोग करके आसानी से एक फ़ंक्शन लिख सकते हैं apply()। उदाहरण के लिए, हम jQuery की .css()विधि में एक सुविधा जोड़ना चाहते हैं । हम मूल फ़ंक्शन संदर्भ को स्टोर कर सकते हैं, कस्टम कोड के साथ फ़ंक्शन को ओवरराइट कर सकते हैं और संग्रहीत फ़ंक्शन को कॉल कर सकते हैं।

var _css = $.fn.css;
$.fn.css = function(){
   alert('hooked!');
   _css.apply(this, arguments);
};

चूँकि मैजिक argumentsऑब्जेक्ट ऑब्जेक्ट की तरह एक सरणी है, हम इसे केवल पास कर सकते हैं apply()। इस तरह हम गारंटी देते हैं, कि सभी मापदंडों को मूल फ़ंक्शन के माध्यम से पारित किया जाता है।


4
बस एक मजेदार tidbit: यदि आपको obj_aउदाहरण के लिए बार-बार फ़ंक्शन को कॉल करने की आवश्यकता है, तो आप इसकी एक प्रति बना सकते हैं var boud_myfunc = myfunc.bind(obj_a)और बस bound_myfunc()आवश्यकतानुसार कॉल कर सकते हैं ।
वबादार्ट

44

उपयोग करेंfunction.call :

var f = function () { console.log(this); }
f.call(that, arg1, arg2, etc);

thatवह वस्तु कहां है जो आप thisफ़ंक्शन में चाहते हैं।


1
functionएक आरक्षित कीवर्ड है; एक function.call(...)मान्य फ़ंक्शन को शामिल करने के लिए अपनी प्रतिक्रिया को अपडेट करने पर विचार करें क्योंकि मान्य जावास्क्रिप्ट नहीं है।
डैनियल एलन

1
@ डैनियल एलेन: मैं जो भी नमूना फ़ंक्शन नाम प्रदान करता हूं, उसकी परिभाषा के बिना, कोड अभी भी एक जेएस त्रुटि फेंक देगा। लेकिन, मैंने नमूना फ़ंक्शन नाम को अपडेट किया।
पलसीम

16

jQuery उस फ़ंक्शन के अंदर .call(...)वर्तमान नोड को असाइन करने के लिए एक विधि का उपयोग करता है जिसे thisआप पैरामीटर के रूप में पास करते हैं।

संपादित करें:

संदेह होने पर jQuery के कोड के अंदर देखने से डरो मत, यह सब स्पष्ट और अच्छी तरह से प्रलेखित जावास्क्रिप्ट में है।

यानी: इस सवाल का जवाब लाइन 574 के आसपास है,
callback.call( object[ name ], name, object[ name ] ) === false


12

आप किसी फ़ंक्शन के संदर्भ को सेट करने के लिए बाइंड फ़ंक्शन का उपयोग कर सकते हैं this

function myFunc() {
  console.log(this.str)
}
const myContext = {str: "my context"}
const boundFunc = myFunc.bind(myContext);
boundFunc(); // "my context"

12

एक और मूल उदाहरण:

काम नहीं कर रहा:

var img = new Image;
img.onload = function() {
   this.myGlobalFunction(img);
};
img.src = reader.result;

काम कर रहे:

var img = new Image;
img.onload = function() {
   this.myGlobalFunction(img);
}.bind(this);
img.src = reader.result;

तो मूल रूप से: बस अपने फ़ंक्शन में .bind (यह) जोड़ें


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