सेट इन्टरवल फ़ंक्शन में पैरामीटर पास करें


320

कृपया सलाह दें कि उपयोग किए जाने वाले फ़ंक्शन में पैरामीटर कैसे पारित करें setInterval

मेरा उदाहरण setInterval(funca(10,3), 500);गलत है।


2
सिंटेक्स:.setInterval(func, delay[, param1, param2, ...]);
O-9

जवाबों:


543

आपको एक अनाम फ़ंक्शन बनाने की आवश्यकता है ताकि वास्तविक फ़ंक्शन तुरंत निष्पादित न हो।

setInterval( function() { funca(10,3); }, 500 );

4
डायनेमिक पैरामीटर के लिए क्या होना चाहिए?
rony36

28
@ rony36 - आप शायद एक ऐसा कार्य करना चाहते हैं जो आपके लिए अंतराल टाइमर बनाता है। फ़ंक्शन के पैरामीटर में पास करें, इसलिए इसका मान फ़ंक्शन क्लोजर में कैप्चर किया जाता है और जब टाइमर समाप्त हो जाता है, तो इसे बरकरार रखा जाता है। function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); }फिर इसे createInterval(funca,dynamicValue,500); स्पष्ट रूप से कॉल करें आप इसे एक से अधिक पैरामीटर के लिए बढ़ा सकते हैं। और, कृपया, अधिक वर्णनात्मक चर नाम का उपयोग करें। :)
tvanfosson

@tvanfosson: जबरदस्त जवाब! क्या आप जानते हैं कि फ़ंक्शन के भीतर अंतराल फॉर्म को कैसे साफ़ किया जाए funca?
फ्लो

@tvanfosson धन्यवाद। मेरा बुरा है, लेकिन मैं वास्तव में createInterval उदाहरण का मतलब था जो आपने टिप्पणी अनुभाग में दिया था। उसके लिए कैसे काम करेगा? मैं एक गतिशील पैरामीटर के रूप में एक टाइमर चर को पारित करने के बारे में भी सोच रहा था, लेकिन यह सुनिश्चित नहीं करता कि कैसे या अगर यह समझ में आता है। स्पष्टता के हित में मैंने यहां एक नया प्रश्न जोड़ा: stackoverflow.com/questions/40414792/…
Flo

78

अब ES5 के साथ, बाँध विधि

setInterval(funca.bind(null,10,3),500);

यहाँ संदर्भ


2
यह सबसे अच्छा जवाब है, हालांकि यह फ़ंक्शन के आधार पर अप्रत्याशित व्यवहार हो सकता है। जैसे console.log.bind(null)("Log me")फेंक देंगे Illegal invocation, लेकिन console.log.bind(console)("Log me")उम्मीद के मुताबिक काम करेंगे। यह इसलिए है क्योंकि arg के रूप में console.logआवश्यक है । consolethis
इंडी

1
अब तक का सबसे अच्छा जवाब। झुक और साफ। आपका बहुत बहुत धन्यवाद!
तोबी

बहुत साफ और कुशल!
contactmatt

2
बस जोड़ दें कि Chrome> = 7, Firefox> = 4.0, एक्सप्लोरर> = 9, ओपेरा> = 11.60, सफारी> = 5.1 (स्रोत: developer.mozilla.org/ca/docs/Web/JavaScript/Reference/… )
रोजर वेकियाना

60

उन्हें मापदंडों के रूप में जोड़ें

setInterval(funca, 500, 10, 3);

आपके प्रश्न का सिंटैक्स eval का उपयोग करता है, जो अनुशंसित अभ्यास नहीं है।


2
Whaa ?! कब से अनुमति थी? (गंभीर प्रश्न)
क्रीसेंट फ्रेश

1
निश्चित नहीं। मेरा स्रोत था: developer.mozilla.org/en/DOM/window.setInterval
केव

2
@Kev Internet Explorer एक वास्तविक गड़बड़ है जो इसे पास करने वाले तर्कों का समर्थन नहीं करता है।
ShrekOverflow

1
IMHO यह स्वीकृत उत्तर होना चाहिए। अच्छा, सरल और साफ समाधान।
लाइटमैन

32

आप फ़ंक्शन ऑब्जेक्ट की संपत्ति के रूप में पैरामीटर (नों) को पास कर सकते हैं, पैरामीटर के रूप में नहीं:

var f = this.someFunction;  //use 'this' if called from class
f.parameter1 = obj;
f.parameter2 = this;
f.parameter3 = whatever;
setInterval(f, 1000);

तब आपके फ़ंक्शन में someFunction, आपके पास मापदंडों तक पहुंच होगी। यह उन वर्गों के अंदर विशेष रूप से उपयोगी है, जहां गुंजाइश स्वचालित रूप से वैश्विक स्थान पर जाती है और आप उस वर्ग के संदर्भ खो देते हैं जिसे शुरू करने के लिए setInterval कहा जाता है। इस दृष्टिकोण के साथ, "someFunction" में "पैरामीटर 2", ऊपर के उदाहरण में, सही गुंजाइश होगी।


1
आप Classname.prototyp.someFunction.parameter1
JoaquinG

2
किसी ऑब्जेक्ट या फ़ंक्शन में पैरामीटर जोड़ने से कंपाइलर धीमा हो सकता है क्योंकि इसे ऑब्जेक्ट का मूल कोड प्रतिनिधित्व फिर से बनाना होगा (उदाहरण के लिए यदि यह एक गर्म लूप में किया गया था) तो सावधान रहें।
Mattdlockyer

22
     setInterval(function(a,b,c){

          console.log(a + b +c);  

      }, 500, 1,2,3);

           //note the console will  print 6
          //here we are passing 1,2,3 for a,b,c arguments
         // tested in node v 8.11 and chrome 69

सबसे अच्छा समझाया गया उत्तर।
Drk_alien

तो क्यों सरणियों के रूप में तर्क पारित करें? यह विवरण प्रश्न से संबंधित नहीं है।
user4642212

18

आप एक अनाम फ़ंक्शन का उपयोग कर सकते हैं;

setInterval(function() { funca(10,3); },500);

1
यह काफी महंगा कॉल है!
रॉय ली

2
@Roylee यह कैसे महंगा है?
user4642212

18
setInterval(function,milliseconds,param1,param2,...)

अपडेट: 2018 - "प्रसार" ऑपरेटर का उपयोग करें

function repeater(param1, param2, param3){
   alert(param1);
   alert(param2);
   alert(param3); 
}

let input = [1,2,3];
setInterval(repeater,3000,...input);


यह तरीका बेहतर है।
उगुर काज़दल

यह तरीका बेहतर है।
उगुर काज़दल

11

अब तक का सबसे व्यावहारिक उत्तर tvanfosson द्वारा दिया गया है, सभी मैं आपको ES6 के साथ एक अद्यतन संस्करण दे सकता हूं:

setInterval( ()=>{ funca(10,3); }, 500);

1
क्या आप कह रहे हैं कि () => {} ES6 का नया तरीका है फंक्शन () {} को बदलना? दिलचस्प। पहले, मुझे लगा कि रॉकेट पस्से थे। और, जब तक इस वाक्यविन्यास के अन्य सामान्य उपयोग नहीं हैं, यह बहुत ही अजीब है। मैं देख रहा हूं कि वे "मोटे तीर" हैं। फिर भी, अजीब। मुझे लगता है कि कोई इसे पसंद करता है और यह राय का विषय है।
रिचर्ड_जी

6

तर्कों का उद्धरण पर्याप्त होना चाहिए:

OK --> reloadIntervalID = window.setInterval( "reloadSeries('"+param2Pass+"')" , 5000)

KO --> reloadIntervalID = window.setInterval( "reloadSeries( "+param2Pass+" )" , 5000)

'प्रत्येक तर्क के लिए एकल उद्धरण नोट करें ।

IE8, Chrome और FireFox के साथ परीक्षण किया गया


7
Eval का प्रयोग एक भयानक अभ्यास है। अनाम फ़ंक्शन का उपयोग बेहतर तरीके से होता है।
सुपरिरिस

1

मुझे पता है कि यह विषय इतना पुराना है, लेकिन यहां setIntervalफ़ंक्शन में पैरामीटर पारित करने के बारे में मेरा समाधान है।

एचटीएमएल:

var fiveMinutes = 60 * 2;
var display = document.querySelector('#timer');
startTimer(fiveMinutes, display);

जावास्क्रिप्ट:

function startTimer(duration, display) {
    var timer = duration,
        minutes, seconds;

    setInterval(function () {
        minutes = parseInt(timer / 60, 10);
        seconds = parseInt(timer % 60, 10);

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        display.textContent = minutes + ":" + seconds;
        --timer; // put boolean value for minus values.

    }, 1000);
}

मुझे फ़ंक्शन को कॉल करते समय एक बार एक मूल्य पर पहुंचने की आवश्यकता है, लेकिन प्रत्येक सेकंड में नहीं, इसलिए आपका उत्तर यह प्रदान करता है (जैसे timer), लेकिन आप clearInterval()इस परिदृश्य में कैसे हैं ?
user1063287

0

यह काम करता है setInterval("foo(bar)",int,lang);.... जॉन क्लेसर मुझे जवाब देने के लिए नेतृत्व करते हैं।


0

एक अन्य समाधान में आपके फ़ंक्शन को पास किया जाता है जैसे (यदि आपको डायनामिक्स संस्करण मिला है): setInterval ('funca (' + x + ',' + y + ')', 500);


0

आप अंडरस्कोर js नामक लाइब्रेरी का उपयोग कर सकते हैं। यह बाँध विधि पर एक अच्छा आवरण देता है और साथ ही एक बहुत अधिक स्वच्छ वाक्यविन्यास है। आपको निर्दिष्ट दायरे में फ़ंक्शन निष्पादित करने देता है।

http://underscorejs.org/#bind

_.bind (कार्य, कार्यक्षेत्र, * तर्क)


0

यह समस्या क्लोजर के उपयोग के लिए एक अच्छा प्रदर्शन होगा। विचार यह है कि एक फ़ंक्शन बाहरी दायरे के एक चर का उपयोग करता है। यहाँ एक उदाहरण है...

setInterval(makeClosure("Snowden"), 1000)

function makeClosure(name) {
var ret

ret = function(){
    console.log("Hello, " + name);
}

return ret;
}

फ़ंक्शन "मेक क्लोजर" एक और फ़ंक्शन देता है, जिसमें बाहरी गुंजाइश चर "नाम" तक पहुंच होती है। तो, मूल रूप से, आपको "मेक क्लोजर" फ़ंक्शन को जो भी चर में पास करने की आवश्यकता होती है और उन्हें "रिट" वेरिएबल को सौंपे गए फ़ंक्शन में उपयोग करें। प्रभावित होकर, setInterval "ret" को सौंपे गए फंक्शन को निष्पादित करेगा।


0

मुझे Vue ऐप में भी यही समस्या है। मेरे मामले में यह समाधान केवल तभी काम करता है जब mounted ()जीवन चक्र हुक पर घोषणा के संबंध में अनाम फ़ंक्शन ने तीर फ़ंक्शन के रूप में घोषित किया है ।

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