2012-11-10 11 views
5

मुझे समझ में नहीं आता कि क्या गलत है।
पहले::एक फ़ंक्शन के अंदर सेट इंटरवल एक त्रुटि उत्पन्न करता है: चर परिभाषित नहीं किया गया है

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
</script> 



दूसरा:

<script language="JavaScript" type="text/javascript"> 
    function countdown() 
    { 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



तीसरा: मैं तीन कोड है

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    function countdown() 
    { 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



पहले कोड ठीक काम करता है, दूसरा एक का उत्पादन "setInterval" पंक्ति में त्रुटि: "गिनती परिभाषित नहीं है", और तीसरा कोड फिर से ठीक काम करता है। "गिनती" चर का दायरा दूसरे कोड में सेट इंटरवल फ़ंक्शन के लिए वैश्विक होना चाहिए। ऐसा क्यों नहीं है? मैं मोज़िला फ़ायरफ़ॉक्स का उपयोग कर रहा हूँ। धन्यवाद।

+0

आपने अभी से एक कारण पाया है कि आपको स्ट्रिंग का उपयोग अंतराल/सेटटाइमआउट के लिए कॉलबैक के रूप में क्यों नहीं करना चाहिए। दाईं ओर संबंधित प्रश्नों पर नज़र डालें, मुझे लगता है कि उनमें से आधा एक ही समस्या साझा करते हैं। – Yoshi

उत्तर

8

कारणों की एक बड़ी संख्या के लिए, जिनमें से एक तुम सिर्फ में, कभी नहीं कभी भाग गया setTimeout या setInterval के लिए एक स्ट्रिंग गुजरती हैं। कभी। वाकई। कोई अच्छा कारण नहीं है।

इसके बजाय एक फ़ंक्शन पास करें। फ़ंक्शन ऑब्जेक्ट्स को पास करने की क्षमता एक जेएस सर्वोत्तम सुविधाएं है।

var count = 0; 
alert(count); 

var timer = setInterval(function(){ 
    count = count + 1; 
    alert(count); 
}, 10000); 

आप जिस समस्या का सामना कर रहे हैं वह यह है कि इस तरीके से एक स्ट्रिंग के रूप में कोड दायरे का सम्मान नहीं करेगा। यह वैश्विक दायरे में निष्पादित होगा, जो एक ऐसा स्थान है जहां आपका चर आपके दूसरे और तीसरे स्निपेट में मौजूद नहीं है। और पहला स्निपेट काम करता है क्योंकि count वास्तव में एक वैश्विक चर है।

इस स्टेम के साथ अन्य समस्याएं मूल रूप से eval है जो अपने सिरदर्द के साथ आता है और पूरी तरह से बचने के लिए सबसे अच्छा है। Eval is Evil सब के बाद।

+0

हाय, एलेक्स वेन! सहायता के लिए धन्यवाद। मुझे अभी तक समझ में नहीं आता है कि स्ट्रिंग इतनी खराब क्यों है, लेकिन मैं आपके द्वारा प्रदान किए गए लिंक का पालन करके कोशिश करूंगा। अजीब बात यह है कि मुद्दे को पढ़ने वाली किताबों में शामिल नहीं है। – GreenBear

+0

संक्षेप में, यह खराब है क्योंकि यह धीमा और संभावित रूप से खतरनाक है (जैसे eval है) और यह उन तरीकों से व्यवहार करता है जिनकी आप अपेक्षा नहीं करते हैं। उन सभी चीजों को वास्तविक वास्तविक फ़ंक्शन का उपयोग करके हल किया जाता है। –

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

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