एक पैरामीटर के रूप में पैरामीटर के साथ एक फ़ंक्शन पास करना?


151

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

उदाहरण:

$(edit_link).click( changeViewMode( myvar ) );

5
यह JQuery की तरह दिखता है, और सबसे अधिक संभावना है, लेकिन यह अप्रासंगिक है। उपयोग और पैरामीटर और फ़ंक्शंस एक समान हैं जो आपके द्वारा उपयोग की जाने वाली पुस्तकालयों की परवाह किए बिना।
गुफ्फा

@Guffa - मुझे आश्चर्य हो रहा था कि क्या इसे
Russ Cam

1
@ ल्यूसिया कृपया इस पर स्वीकृत उत्तर को बदलने पर विचार करें
माइकल पेर्लाकोव्स्की

यदि आप रिएक्ट के साथ काम कर रहे हैं, तो stackoverflow.com/questions/41369497/…
माइकल फ्रीजिम

जवाबों:


244

एक "बंद" का उपयोग करें:

$(edit_link).click(function(){ return changeViewMode(myvar); });

यह एक अनाम अस्थायी फ़ंक्शन आवरण बनाता है जो पैरामीटर के बारे में जानता है और वास्तविक कॉलबैक कार्यान्वयन के लिए इसे पास करता है।


3
यदि आप किसी फ़ंक्शन को किसी ऑब्जेक्ट पर कॉल करना चाहते हैं, तो आपको बाइंड () कॉल करना होगा। myObj.click (फ़ंक्शन () {this.doSomething ();} .bind (myObj)); कि "यह" हो जाएगा myObj।
एली

1
क्या यह एक प्रदर्शन का मुद्दा नहीं है जब इनमें से बहुत से निपटते हैं? उदाहरण के लिए, आप एक पंक्ति में एक onPress प्रदान कर रहे हैं और आपके पास 10,000 पंक्तियाँ हैं। यह प्रत्येक रो के लिए एक नया अनाम अस्थायी फ़ंक्शन आवरण बनाता है। क्या इसका कोई और तरीका है?
जोशुआ पिंटर

@JoshuaPinter तकनीक स्वयं कोई समस्या नहीं है। यदि आपको 10,000 बार एक ही फ़ंक्शन कॉल की आवश्यकता होती है, तो आप बस रैपर को एक चर में सहेज सकते हैं, इसलिए आप इसे केवल एक बार बनाते हैं। यदि आपको 10,000 अलग-अलग संदर्भों को पारित करने की आवश्यकता है, तो बहुत कम है जो आप कर सकते हैं। समय से पहले अनुकूलन से सावधान रहें: हमेशा प्रदर्शन के साथ, आपको यह देखने के लिए मापना होगा कि कोई समस्या है या नहीं। आज के जावास्क्रिप्ट इंजन बहुत शक्तिशाली हैं और कोड को आश्चर्यजनक तरीके से अनुकूलित कर सकते हैं।
फर्डिनेंड बेयर

@FerdinandBeyer बहुत बढ़िया, टिप के लिए धन्यवाद। एक मित्र ने मुझे बताया कि यह बुरा अभ्यास था और आपको इसके बजाय this.myFunction = this.myFunction.bind(this)अपनी constructorविधि का उपयोग करना चाहिए । लेकिन, जैसा आपने कहा, जब आपको हर एक के लिए अलग-अलग संदर्भों को पास करना होता है, जैसे कि उन सभी अलग-अलग पंक्तियों को जो आप उस पंक्ति के विवरण पृष्ठ को खोलने के लिए क्लिक करते हैं, तो यह बेहतर नहीं है।
जोशुआ पिंटर

@FerdinandBeyer, मान लीजिए कि myVar एक स्ट्रिंग है और इसकी एक बंद के रूप में changeViewMode गुजर लगातार दो आमंत्रण के बीच बदल गया है, लेकिन changeViewMode हमेशा myVar के पहले मूल्य प्राप्त करता है, मैं एक ही myVar चर को अलग अलग तर्क मान के साथ कॉल बंद समारोह करना चाहते हैं,
nmxprime

42

का उपयोग करें Function.prototype.bind()। एमडीएन का हवाला देते हुए:

bind()विधि एक नया कार्य है कि, जब कहा जाता है, इसकी है बनाता thisकीवर्ड सेट प्रदान किया गया मान के लिए, पिछले जब नया समारोह कहा जाता है किसी भी प्रदान किए गए तर्कों की दी गई अनुक्रम के साथ।

यह IE9 + सहित सभी प्रमुख ब्राउज़रों द्वारा समर्थित है।

आपका कोड इस तरह दिखना चाहिए:

$(edit_link).click(changeViewMode.bind(null, myvar));

साइड नोट: मेरा मानना ​​है कि आप वैश्विक संदर्भ में हैं, अर्थात thisपरिवर्तनशील है window; अन्यथा के thisबजाय का उपयोग करें null


धन्यवाद, इससे मुझे मदद मिली। इसे इस तरह इस्तेमाल किया:$.ajax(url).done(handler.bind(this, var1, var2));
थॉमस

2
कौन सा विकल्प सबसे अच्छा है? बाइंड फंक्शन का उपयोग करना या बंद करना? कृपया मुझे बताएं कि क्या कोई प्रदर्शन प्रभाव है
वरुण


15

नहीं, लेकिन आप मापदंडों के बिना एक पास कर सकते हैं, और यह कर सकते हैं:

$(edit_link).click(
  function() { changeViewMode(myvar); }
);

तो आप बिना किसी पैरामीटर के एक अनाम फ़ंक्शन पास कर रहे हैं, वह फ़ंक्शन तब बंद में चर के साथ अपने पैरामीटर किए गए फ़ंक्शन को कॉल करता है



7

या यदि आप es6 का उपयोग कर रहे हैं, तो आपको एक तीर फ़ंक्शन का उपयोग करने में सक्षम होना चाहिए

$(edit_link).click(() => changeViewMode(myvar));

2

तुम यह केर सकते हो

var message  = 'Hello World';

var callback = function(){
alert(this)
}.bind(message);

और फिर

function activate(callback){
  callback && callback();
}

activate(callback);

या यदि आपके कॉलबैक में अधिक लचीले तर्क हैं तो आप ऑब्जेक्ट पास कर सकते हैं।

डेमो


2

यह फर्डिनेंड बेयर के दृष्टिकोण के बाद एक उदाहरण है:

function function1()
{
    function2(function () { function3("parameter value"); });
}
function function2(functionToBindOnClick)
{
    $(".myButton").click(functionToBindOnClick);
}
function function3(message) { alert(message); }

इस उदाहरण में "पैरामीटर मान" फ़ंक्शन 1 से फ़ंक्शन 3 के माध्यम से फ़ंक्शन 2 से फ़ंक्शन 3 से पारित किया जाता है।

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