Sunday, 15 September 2013

javascript - setInterval overriding others setIntervals -


इस सवाल का पहले से ही एक उत्तर है: < 31 उत्तरों

मैं बनाने की कोशिश कर रहा हूँ / p>

  • अजीब के साथ कोड स्निपेट व्यवहार:

      var टाइमआउट फ़ंक्शन = {}; फ़ंक्शन log_on_console (text) {console.log ('& gt; & gt; फ़ंक्शन के अंदर:' + पाठ)} $ (दस्तावेज़) .ready (फ़ंक्शन () {for (i = 0; i & lt; 5; i ++) { कंसोल.लाग (फ़ंक्शन से पहले: '+ i) टाइमआउट फ़ंक्शंस [i] = सेट इन्टरवल (फ़ंक्शन () {लॉग_ऑन_कॉनोल (आई)}, 2000);}});  
      & lt; script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min कंसोल पर आउटपुट है:  
      "कंसोल पर आउटपुट     
    कार्य करने से पहले: 1 "js: 21: 6" & gt; & gt; & gt; कार्य के पहले: 2 "जेएस: 21: 6: कार्य करने से पहले: & gt; & gt; & gt; फ़ंक्शन: 0" जेएस: 21: 6 "& gt; & gt; "फ़ंक्शन के पहले": "जेएस: 21: 6" gt; & gt; & gt; फ़ंक्शन के अंदर: 5 "(5) जेएस : 16: 2 // (यह एक "समस्या" है)

    मैं इसके बजाय कुछ ऐसा expexcting था:

      "gt; & gt; & gt ; आनन्दटी से पहले; पर: 0 "जेएस: 21: 6" & gt; & Gt; & Gt; कार्य से पहले: 1 "जेएस: 21: 6" & gt; & Gt; & Gt; कार्य से पहले: 2 "जेएस: 21: 6" & gt; & Gt; & Gt; कार्य से पहले: 3 "जेएस: 21: 6" & gt; & Gt; & Gt; कार्य से पहले: 4 "जेएस: 21: 6" & gt; & Gt; & Gt; फ़ंक्शन के अंदर: 0 "जेएस: 16: 2" & gt; & Gt; & Gt; फ़ंक्शन के अंदर: 1 "जेएस: 16: 2" & gt; & Gt; & Gt; फ़ंक्शन के अंदर: 2 "जेएस: 16: 2" & gt; & Gt; & Gt; फ़ंक्शन के अंदर: 3 "जेएस: 16: 2" & gt; & Gt; & Gt; अंदर का कार्य: 4 "जेएस: 16: 2  

    अतः, अंतिम सेट इन्टरवाल (फ़ंक्शन () {log_on_console (i)}, 2000) क्यों ओवरराइड कर रहा है पिछले चार?

यहाँ फ़ंक्शन:

  टाइमआउट फ़ंक्शंस [i] = SetInterval (function () {log_on_console (i)}, 2000);  

... में एक स्थायी संदर्भ को i वेरिएबल, फ़ंक्शन निर्मित होने के समय के रूप में इसके मान की एक प्रति नहीं है। इसलिए यह i मान का उपयोग करता है जब इसे बुलाया जाता है

यदि आप समारोह बनाते समय समारोह में मूल्य को को जला देना चाहते हैं, तो आप फंक्शन # बाँध का उपयोग कर सकते हैं: <

या अधिक सीधे अपने अनाम फ़ंक्शन के रूप में सिर्फ log_on_console कॉल कर रहा है:

  टाइमआउट फ़ंक्शन [i] = setInterval (log_on_console .बिंड (नल, आई), 2000);  

फ़ंक्शन # बाँध एक फ़ंक्शन देता है, जिसे कॉल किया जाता है, मूल कार्य को यह से पहले तर्क के साथ सेट करेगा बाँध , और किसी भी अतिरिक्त तर्क के साथ गुजर रहा है चूंकि आपका फ़ंक्शन यह का उपयोग नहीं कर रहा है, इसलिए मैंने उस कोड के लिए null का उपयोग किया है उदा।:

  फ़ंक्शन फ़ू (a) {console.log ("a =" + a); } Var f = foo.bind (नल, 1); च ();  

हमें पता चलता है:

 a = 1 

साइड नोट: आपका कोड शिकार हो रहा है क्योंकि आप < कोड> मैं कहीं भी।


No comments:

Post a Comment