2011-11-08 19 views
11

क्या इसे सीधे कॉल करने के बजाए फ़ंक्शन को कॉल करने के लिए सेटटाइमआउट विधि का उपयोग करके जावास्क्रिप्ट में एक स्टैक ओवरफ़्लो से बचा जा सकता है? सेटटाइमआउट की मेरी समझ यह है कि इसे एक नया कॉलस्टैक शुरू करना चाहिए। जब मैं क्रोम और आईई दोनों के कॉलस्टैक में देखता हूं तो ऐसा लगता है कि सेटटाइम कॉल कॉल फ़ंक्शन कॉल को वापस करने की प्रतीक्षा कर रहे हैं।क्या कॉलटाइम कॉलिंग को कॉलस्टैक साफ़ करता है?

क्या यह सिर्फ डीबगर की संपत्ति है या मेरी समझ त्रुटिपूर्ण है?

संपादित

जबकि नीचे प्रदान की उत्तर सही हैं, वास्तविक समस्या मैं हो रही थी तथ्य यह है कि मैं बुला रहा था setTimeout (aFunction(), 10) जो aFunction तुरंत वजह से मूल्यांकन कर संबंधित था कोष्ठक। This question मुझे हल किया।

+0

समारोह 'setTimeout' में पारित समारोह है कि लागू' setTimeout' लौटे से पहले लागू नहीं किया जा सकता। तो हाँ, वह फ़ंक्शन एक नया कॉलस्टैक शुरू करता है। –

उत्तर

12

मैं पुष्टि कर सकता हूं कि ढेर साफ़ हो गया है।

इस परिदृश्य पर विचार करें:

function a() { 
    b(); 
} 

function b() { 
    c(); 
} 

function c() { 
    debugger; 
    setTimeout(d, 1000); 
} 

function d() { 
    debugger; 
} 

a(); 

तो दो breakpoints कर रहे हैं - समारोह c की शुरुआत में एक है, और समारोह d की शुरुआत में एक।

  • सी()
  • ख()
  • दूसरा ब्रेकप्वाइंट पर एक()

ढेर: पहली ब्रेकप्वाइंट पर

ढेर

  • घ()

लाइव डेमो:http://jsfiddle.net/nbf4n/1/

+0

सही दिशा में मुझे इंगित करने के लिए धन्यवाद, मैं आपके उत्तर के आधार पर हल करने में सक्षम था, हालांकि मेरे पास एक और सवाल है http://stackoverflow.com/questions/8058996/why-does-calling-settimeout-with-parenthesis- नॉन-स्टार्ट-ए-न्यू-कॉलस्टैक –

+0

यदि यह लड़का सही है, तो आपका उत्तर सही जवाब कैसे हो सकता है? चूंकि यह लड़का कह रहा है कि यह हमेशा कॉलबैक कतार में आपकी कॉलबैक को धक्का देता है, न कि स्टैक और इसलिए अगर कॉल स्टैक में सिंक्रोनस कमांड चल रहा है, या स्टैक में अन्य चीजें इसे निर्दिष्ट मिलीसेकंड से भी अधिक प्रतीक्षा करनी है । तो यह हमेशा 1: 1 नहीं होता है। ऐसा हो सकता है: अरे मैंने आपको 5 सेकंड देरी दी है आप 7 में वापस क्यों आ रहे हैं? क्योंकि कॉलबैक को थोड़ा और इंतजार करना पड़ा। https://youtu.be/8aGhZQkoFbQ?t=782 – PositiveGuy

+0

'सेटटाइमआउट' के दूसरे तर्क के माध्यम से आप जो विलंब निर्दिष्ट करते हैं, वह गारंटी नहीं देता है कि उस विशिष्ट बिंदु पर कॉलबैक को सही समय पर बुलाया जाएगा; लेकिन मेरा जवाब यह नहीं कहता कि यह होगा। –

4

Async invocations, जैसे setTimeout, वास्तव में एक नया कॉलस्टैक उत्पन्न करते हैं।

यह कहता है कि जब आप कहते हैं कि "जब मैं क्रोम और आईई दोनों के कॉलस्टैक में देखता हूं तो ऐसा लगता है कि सेटटाइमआउट कॉल फ़ंक्शन कॉल को वापस करने की प्रतीक्षा कर रहा है।" लेकिन, एक चीज जो आप कर सकते हैं उसे setTimeout नामक फ़ंक्शन के अंदर ब्रेकपॉइंट डाल दिया गया है, और देखें कि कॉलस्टैक खाली है।

+0

क्या आपको पता है कि मैं अभी भी डीबगर में संपूर्ण कॉलस्टैक क्यों देख सकता हूं? क्या ऐसा इसलिए है क्योंकि सेटटाइमआउट से मेरा फ़ंक्शन कॉल कुछ स्थानीय चरों को प्राप्त करने के लिए बंद करने का उपयोग करता है? –

+1

@AranMulholland आप डीबगर कहां से आते हैं? 'SetTimeout' में पारित फ़ंक्शन के अंदर? प्रश्न के अनुसार –

+0

@ ŠimeVidas, मैं बस ब्राउज़र डिबगर्स (क्रोम और आईई) –