2013-06-13 10 views
5

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

function shootball(angle, speed){ 
    angle = (angle/360.0)*2*Math.PI; 
    var ballmotion = setInterval(function(){ 
     var nowx, nowy, minusY, plusX; 
     nowx = $("#ball").position().left; 
     nowy = $("#ball").position().top; 
     minusY = Math.sin(angle) * 4.0; 
     plusX = Math.cos(angle) * 4.0; 
     if(hitsWall(nowx+plusX, nowy-minusY)){ 
      clearInterval(ballMotion); 
      shootball(newAngle(nowx+plusX, nowy-minusY), speed); 
     } 
     $("#ball").css("left", (nowx + plusX)).css("top", (nowy - minusY)); 
    }, 10/speed); 
} 

मैं बड़ा अनावश्यक प्रत्यावर्तन का एक बड़ा प्रशंसक नहीं हूँ, लेकिन मैं सिर्फ इसे आज़माने के लिए करना चाहता था। लो और देखो यह ठीक तरह से काम करता है जैसा कि मैं उम्मीद करता हूं। लेकिन जैसे ही मैंने बाकी कार्यक्रम को पेश करना शुरू किया, यह मेरे लिए हुआ कि मेरे पास इस पुनरावर्ती प्रकृति से बचने का कोई तरीका नहीं था। तो मेरा सवाल: क्या जावास्क्रिप्ट किसी भी तरह से पहचानता है कि कॉलिंग "शूटबॉल" फ़ंक्शन स्पष्ट अंतराल को कॉल करने के बाद अनिवार्य रूप से समाप्त हो गया है? या क्या यह वास्तव में अनावश्यक सक्रियण रिकॉर्ड के साथ अपने ढेर को लोड कर रहा है? किसी भी विशेषज्ञता के लिए अग्रिम धन्यवाद, यह ड्रम हो सकता है।

+2

आप ब्रेक पॉइंट सेट कर सकते हैं और कॉलस्टैक पर एक नज़र डालें;) –

+1

यदि किसी फ़ंक्शन को अंतराल की तुलना में अधिक समय लगता है, तो _setInterval_ खराब हो सकता है, इसके बजाय _setTimeout_ का उपयोग करने पर विचार करें। साथ ही, मुझे यकीन है कि आप अभिव्यक्ति के बाहर अधिकांश फ़ंक्शन को स्थानांतरित कर सकते हैं ताकि प्रत्येक बार एक नया फ़ंक्शन इंस्टेंस नहीं बनाया जा सके। –

+0

मुझे पूरी तरह से यकीन नहीं है लेकिन मेरा मानना ​​है कि जब भी गेंद दीवार पर नहीं जाती है तो ढेर खाली हो जाता है। – aledujke

उत्तर

4

क्या जावास्क्रिप्ट किसी भी तरह से पहचानता है कि कॉलिंग "शूटबॉल" फ़ंक्शन स्पष्ट अंतराल को कॉल करने के बाद अनिवार्य रूप से समाप्त हो गया है?

नहीं है, shootball बहुत पहले समाप्त हो गया था, सही ballmotion को काम के बाद। हालांकि, इसके परिवर्तनीय दायरे (angle, speed, ballmotion और अभिभावक स्कोप) तब तक बने रहे जब अज्ञात फ़ंक्शन ने इसके साथ बंद कर दिया और बाहर से (शेड्यूलर से) संदर्भित किया गया था। और उस दायरे को clearInterval कॉल के बाद कचरा इकट्ठा किया जाएगा जो इसके संदर्भों को हटा देता है।

क्या यह वास्तव में अनावश्यक सक्रियण रिकॉर्ड के साथ अपना ढेर लोड कर रहा है?

नहीं। हर समारोह एक नया कॉल स्टैक के साथ अपने स्वयं के निष्पादन संदर्भ में setTimeout/setInterval रन के माध्यम से क्रियान्वित किया जाता है कि,।

+0

कुछ ब्राउज़रों में वेरिएबल को साफ़ नहीं किया जा सकता है क्योंकि वे पृष्ठ के चलते सभी जीवों को जीवित रखेंगे। –

+0

@ डेरेक: क्या आपका मतलब है कि कुछ ब्राउज़रों ने 'स्पष्ट अंतराल' का कचरा संग्रह खींचा है? – Bergi

+0

मुझे यकीन नहीं है लेकिन चूंकि मुझे नहीं लगता कि यह मानकों में लिखा गया है, इसलिए ब्राउज़र को बेकार चर को साफ़ करने की आवश्यकता नहीं है। –

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