2011-11-01 28 views
7

कैसे आ मैं कह सकता हूँ:मैं कब्रिस्तान का उपयोग करता हूं और कब नहीं करता?

var myFunction = function() { 
    setTimeout(myFunction, 1000); 
} 
myFunction(); 

क्यों setTimeout में समारोह कॉल एक कोष्ठक की आवश्यकता नहीं है, लेकिन अंतिम पंक्ति है?

उत्तर

6

myFunction एक समारोह

myFunction() समारोह और पैदावार जो भी मान समारोह रिटर्न कॉल है।

सेटटाइमआउट का उद्देश्य कुछ समय बीतने के बाद कोड चला रहा है। आपको केवल उस फ़ंक्शन को पास करने की आवश्यकता है (इसलिए सेटटाइमआउट स्वयं उपयुक्त होने पर फ़ंक्शन को कॉल कर सकता है) क्योंकि अगर आपने इसे सेट करने से पहले फ़ंक्शन (कोष्ठक के साथ) कहा है तो यह अब निष्पादित करेगा, बजाय 1 सेकंड के बाद।

+0

ओह ... यह समझ में आता है। –

17

setTimeout फ़ंक्शन एक फ़ंक्शन संदर्भ * तर्क के रूप में अपेक्षा करता है: संदर्भ चर हैं, और इसमें ब्रांड्स नहीं हैं।

फ़ंक्शन कॉल को ब्रांड्स की आवश्यकता होती है (भले ही फ़ंक्शन कोई पैरामीटर नहीं लेता हो)।

संक्षेप:myFunction फ़ंक्शन का संदर्भ है। myFunction() फ़ंक्शन निष्पादित करता है, और एक अभिव्यक्ति में, फ़ंक्शन के रिटर्न वैल्यू (या undefined "को वापस नहीं किया जाएगा, तो कुछ भी वापस नहीं किया जाएगा)।

गहराई: परिस्थितियों में जहां setTimeout(myFunction(), 1000) मतलब हो सकता है, अगर myFunction() ही एक फ़ंक्शन की तरह कर रहे हैं। उदाहरण के लिए:

var myFunction = function() { 
    return function() { 
     alert("ohai"); 
    }; 
}; 
  • गुमनाम समारोह (एक भी return बयान से युक्त) तुरंत मार डाला जाता है।
  • उस फ़ंक्शन का वापसी मूल्य स्वयं एक फ़ंक्शन है जिसमें alert है।

तो:

  • अकेले myFunction एक समारोह के लिए एक संदर्भ (जो फ़ंक्शन रिटर्न के लिए होता है)।
  • myFunction() निष्पादित करेगा। यह setTimeout() के लिए उपयुक्त फ़ंक्शन संदर्भ का मूल्यांकन करता है।
अंत में

:

setTimeout(myFunction(), 1000); 

यह एक सेकंड में myFunction() की वापसी मान कहता है। एक सेकंड बाद, ऊपर चेतावनी पॉप।

भी देखें Why function statement requires a name?

* या एक स्ट्रिंग का मूल्यांकन किया जाना है, लेकिन एक संदर्भ पसंद किया जाता है।

+0

उसने क्या कहा ^^^^^ – JonH

+1

अजीब। जावास्क्रिप्ट एक quirky भाषा है। –

+2

@cf_PhillipSenn: यह मूल रूप से पायथन या सी (फ़ंक्शन पॉइंटर्स) में समान है। फ़ंक्शन का नाम केवल संदर्भ प्रदान करता है। इसके पीछे कोष्ठक जोड़ना इसे कॉल करता है। बेशक यह उन भाषाओं में मौजूद नहीं है जहां कार्य प्रथम श्रेणी की वस्तुएं नहीं हैं और इसलिए सीधे संदर्भित नहीं किया जा सकता है (जैसे जावा)। –

2

लाइन 2 में, समारोह myFunction कहा जाता है नहीं है, लेकिन setTimeout कार्य करने के लिए एक तर्क के रूप पारित कर दिया, जबकि लाइन में 4 myFunction कहा जाता है; फ़ंक्शन को कॉल करने के लिए, हमेशा को ब्रांड्स का उपयोग करना होगा, भले ही कोई तर्क न हो।

+1

मुझे लगता है कि एक 25 वाट प्रकाश बल्ब बस चला गया। –

5

जब आप कोष्ठक का उपयोग करते हैं, तो यह कह रहा है कि 'अब यह फ़ंक्शन कॉल करें'। तो यदि आप setTimeout(myFunction(),1000); कहते हैं, तो यह टाइमआउट के कॉलबैक के रूप में वापसी मान फ़ंक्शन का उपयोग करेगा। यदि फ़ंक्शन के लिए वापसी मान स्वयं एक फ़ंक्शन नहीं है, तो आपको एक त्रुटि मिलेगी क्योंकि यह उस समय को निष्पादित करने का प्रयास करेगा जो टाइमआउट के बाद निष्पादन योग्य नहीं है (एक स्ट्रिंग, एक संख्या, अपरिभाषित, आदि)।

+0

आह हाँ। ठीक। धन्यवाद! –

+0

हालांकि, ध्यान देने योग्य मूल्य: यदि वापस लौटाई गई स्ट्रिंग निष्पादन योग्य थी, जैसे 'चेतावनी ("हैलो वर्ल्ड!");' यह इस संदर्भ में काम करेगी क्योंकि 'सेटटाइमआउट' जेएस कोड अक्षर के रूप में स्ट्रिंग स्वीकार कर सकता है। – Chris

संबंधित मुद्दे