2012-04-16 9 views
46

चलाता है मेरे पास यह काउंटर है लेकिन मैं इसे हमेशा के लिए चलाने के लिए चाहता हूं, यह वास्तव में सरल है, मैं यहाँ क्या गलत कर रहा हूं?सेट इंटरवल कॉलबैक केवल

function timer() { 
    console.log("timer!") 
} 

window.setInterval(timer(), 1000) 
+6

समस्या यह है कि 'टाइमर()' फ़ंक्शन-ऑब्जेक्ट को आमंत्रित करता है जो 'टाइमर' का मूल्यांकन करने के परिणामस्वरूप होता है और फिर परिणाम ('अपरिभाषित') को 'setTimeout' पर पास करता है। तो, इसे न लें। इसके बजाय, बस फ़ंक्शन-ऑब्जेक्ट को पास करें: 'setInterval (टाइमर, 1000) ' –

उत्तर

76

आपने फ़ंक्शन संदर्भ की बजाय फ़ंक्शन कॉल का उपयोग सेट इंटरवल के पहले पैरामीटर के रूप में किया था। इस तरह करें:

window.setInterval(function() { 
    console.log("timer!"); 
}, 1000) 
+1

उत्तर सही ढंग से इंगित करता है कि कॉलबैक फ़ंक्शन में तर्क में"() "नहीं होना चाहिए। – Kristian

+2

https://developer.mozilla.org/en/Extensions/Common_causes_of_memory_leaks_in_extensions#Be_careful_with_setInterval.2FsetTimeout के अनुसार, छोटा संस्करण स्मृति रिसाव का कारण बन सकता है। क्रेंड किंग द्वारा लिंक के अनुसार –

+0

, मोज़िला बेकार है। – nothrow

8

setInterval और setTimeout कॉलबैक के साथ इस्तेमाल किया जाना चाहिए, जैसे:

setInterval(timer, 1000); 

function timer() { 
    console.log("timer!"); 
} 

window.setInterval(timer, 1000); 

या कम (लेकिन जब समारोह भी बड़ा कम पठनीय हो जाता है)

या अनाम नाम:

setInterval(function() { console.log("timer!"); }, 1000); 

आपका कोड क्यों काम नहीं कर रहा है - जब आप किसी फ़ंक्शन को ब्रैकेट के साथ किसी अन्य फ़ंक्शन के लिए तर्क के रूप में पास करते हैं उदा। doSomething (someFunc()) आप फ़ंक्शन का परिणाम पास कर रहे हैं।

जब फ़ंक्शन ऑब्जेक्ट के रूप में पास किया जाता है उदा। doSomething (someFunc) आप कॉलबैक पास कर रहे हैं। इस प्रकार someFunc संदर्भ के रूप में पारित किया गया है और इसे कॉलिंग फ़ंक्शन में कहीं भी निष्पादित किया गया है। यह अन्य भाषाओं में काम करने के लिए पॉइंटर्स के समान है।

w3schools पर दिखाए गए इन दो कार्यों का उपयोग करना एक आम गलती है। यह eval पर एक निहित कॉल करता है।