2009-09-01 14 views
13

जावास्क्रिप्ट में, वहाँ इन दोनों के बीच किसी भी अलग है: क्योंकि हाल ही में स्थिति है जहाँ कोड तभी काम करता है मैं setTimeout(0) का उपयोग फ़ंक्शन को कॉल करने में आएमाईफंक्शन() बनाम window.setTimeout ('MyFunction()', 0)?

// call MyFunction normal way 

MyFunction(); 

// call MyFunction with setTimeout to 0 // 

window.setTimeout('MyFunction()', 0); 

कारण मैंने पूछा था। मेरी समझ के लिए, setTimeout(0) बिल्कुल फ़ंक्शन को कॉल करने जैसा ही है क्योंकि आप कोई देरी सेट नहीं करते हैं। लेकिन मैं देखता हूं कि यह कोड में कैसे काम करता है, setTimeout(0) अंतिम रूप से निष्पादित प्रतीत होता है।

क्या कोई स्पष्ट कर सकता है कि setTimeout(0) वास्तव में अन्य फ़ंक्शन कॉल के क्रम में कैसे कॉल किया जाता है?

+1

http: // stackoverflow।कॉम/प्रश्न/77937 9/क्यों-करता-settimeoutfn-0-कभी-कभी मदद –

उत्तर

17

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

कॉल स्टैक खाली होने में काफी समय लग सकता है, यही कारण है कि आप निष्पादन में देरी देख रहे हैं। यह मुख्य रूप से एक खिड़की संदर्भ में जावास्क्रिप्ट की एकल-थ्रेडेड प्रकृति के कारण होता है।

पूर्णता के लिए, MyFunction() तुरंत फ़ंक्शन निष्पादित करेगा। कोई कतार शामिल नहीं होगा।

पीएस: John Resig has some useful notes on how the JavaScript timing mechanism works

पी पी एस: कारण अपने कोड केवल जब आप setTimeout का उपयोग (एफ एन(), 0) कि चूंकि ब्राउज़र डोम अद्यतन कर सकता है केवल जब वर्तमान कॉल स्टैक पूरा हो गया है कि "काम करने के लिए लगता है" क्यों। इसलिए, अगला जावास्क्रिप्ट ब्लॉक डीओएम परिवर्तनों को पहचान लेगा, जो आपके मामले में काफी संभव है। एक सेटटाइमआउट() कॉलबैक हमेशा एक नया कॉल स्टैक बनाता है।

3

मुझे लगता है कि टाइमआउट केवल तभी शुरू होता है जब पृष्ठ पूरी तरह से लोड हो जाता है, जबकि केवल एक सादा 'माईफंक्शन()' संसाधित हो जाता है जैसे ही इसे संसाधित किया जाता है।

+1

यह सही है। अनुमान लगाने की कोई ज़रूरत नहीं है। –

+1

@ मैरियस एक टेस्ट पेज सेट अप करें और इसे आजमाएं - इनलाइन फ़ंक्शंस शीर्ष आग पर घोषित सेटटाइमआउट (0) से पहले पेज के नीचे सभी तरह से आग लग जाएगा। –

+0

कोशिश की, आप सही थे, और मेरी टिप्पणी हटा दी, लेकिन इससे पहले कि आपने इसे देखा न हो। – Marius

0

आपके वर्तमान धागे को पूरा करने के बाद टाइमर निष्पादित करने का प्रयास करेगा। यह इस बात पर निर्भर करता है कि आप window.setTimeout() कहां कॉल करते हैं। यदि यह जावास्क्रिप्ट टैग में है, लेकिन फ़ंक्शन के अंदर नहीं है, तो जावास्क्रिप्ट टैग के अंत तक पहुंचने के बाद इसे कॉल किया जाएगा। उदाहरण के लिए:

<html> 
<script type="text/javascript"> 
setTimeout(function(){alert("hello")},0); 
var d=Number(new Date())+1000; 
while(Number(new Date())<d){ 

} 
alert("hi"); 
</script> 
</html> 

आप एक समारोह है कि, एक घटना घटित से परिणाम उदाहरण ऑनलोड के लिए अंदर setTimeout फोन है, तो यह ईवेंट हैंडलर समारोह रिटर्न जब तक इंतजार करेंगे:

<html> 
<script type="text/javascript"> 
document.addEventListener("mousedown",function(){ 
    setTimeout(function(){alert("hello")},0); 
    var d=Number(new Date())+1000; 
    while(Number(new Date())<d){ 

    } 
    alert("hi"); 
}, true); 
</script> 
</html> 

यह असंभव है जावास्क्रिप्ट में एक थ्रेड बनाने के लिए प्रतीक्षा करें जबकि एक और धागा चल रहा है। इवेंट श्रोताओं का इंतजार तब तक होगा जब तक कि मौजूदा थ्रेड चलने से पहले नहीं किया जाता है।

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

+0

जो कुछ भी आप कहते हैं वह सामान्य अर्थ में सही है (जावास्क्रिप्ट एकल-थ्रेडेड है) लेकिन पृष्ठ लोड होने पर सेटटाइमआउट (0) आग लग जाएगा, जब यह स्क्रिप्ट ब्लॉक के अंत में नहीं होगा। –

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