2009-11-04 17 views
23

इस तरह के पाश पर विचार करें:JavaScript वैरिएबल बाध्यकारी और पाश

for(var it = 0; it < 2; it++) 
{ 
    setTimeout(function() { 
     alert(it); 
    }, 1); 
} 

उत्पादन होता है:

=> 2 
=> 2 

मैं इसे चाहते हैं होने के लिए: 0, 1. मैं इसे ठीक करने के दो तरीके देखें:

समाधान # 1.

यह इस तथ्य पर आधारित है कि हम सेटटाइमआउट पर डेटा पास कर सकते हैं।

for(var it = 0; it < 2; it++) 
{ 
    setTimeout(function(data) { 
     alert(data); 
    }, 1, it); 
} 

समाधान # 2.

function foo(data) 
{ 
    setTimeout(function() { 
     alert(data); 
    }, 1); 
} 

for(var it = 0; it < 2; it++) 
{ 
    foo(it); 
} 

क्या कोई अन्य विकल्प हैं?

उत्तर

42

नहीं वास्तव में कुछ आपको इन दो तरीकों का प्रस्ताव किया है, लेकिन यहां से भी अधिक एक और

for(var it = 0; it < 2; it++) 
{ 
    (function() { 
     var m = it; 
     setTimeout(function() { 
      alert(m); 
     }, 1); 
    })(); 
} 

है अनिवार्य रूप से, आप एक बंद में चर मूल्य पर कब्जा करने की जरूरत है। स्थानीय चर m में बाह्य परिवर्तनीय मान it को कैप्चर करने के लिए यह विधि तुरंत आवंटित अज्ञात फ़ंक्शन का उपयोग करती है।

यहां Working Demo के साथ खेलने के लिए है। URL जोड़ना /संपादन कोड

+4

+1। हालांकि, आप विधि हस्ताक्षर को बदलकर थोड़ा सा संशोधित कर सकते हैं: 'function (m) {/ * code * /}) (it); ' – Alan

+0

+1, लेकिन क्या कोई मुझे बता सकता है कि यह क्यों काम कर रहा है ?! –

+1

@digorydoo लूप में घोषित फ़ंक्शन कोष्ठक में लपेटा जाता है जिसके बाद कोष्ठक के एक सेट के द्वारा कार्य किया जाता है जो तुरंत कार्य को आमंत्रित करने के लिए कार्य करता है। चूंकि चर को उस फ़ंक्शन पर स्कॉप्ड किया जाता है जिसमें उन्हें घोषित किया जाता है (या किसी फ़ंक्शन के भीतर घोषित नहीं होने पर वैश्विक दायरा), प्रत्येक पुनरावृत्ति में 'it' का मान' m' चर को असाइन किया जाता है जो निष्पादित किए गए फ़ंक्शन पर स्कॉप्ड होता है हाथोंहाथ। –

1

ऊपर समाधान लेकिन setTimeout सुविधा

for(var it = 0; it < 2; it++) 
{ 
    setTimeout(function(cur) { 
     return function(){ 
      alert(cur); 
     }; 
    }(it), 1); 
} 
7

देना कीवर्ड के साथ के अंदर स्वयं प्रेरक की तरह देखने के लिए आप इस पूरी तरह से आसपास पहुंच सकते हैं:

for(let it = 0; it < 2; it++) 
{ 
    setTimeout(function() { 
     alert(it); 
    }, 1); 
} 
+0

लेकिन जावास्क्रिप्ट में 'let' नामक कीवर्ड नहीं है, यह टाइपस्क्रिप्ट में है जो मुझे लगता है –

1

अन्य समाधानों के समान, लेकिन मेरी राय में क्लीनर:

for (var it = 0; it < 2; it++) { 
    // Capture the value of "it" for closure use 
    (function(it) { 
    setTimeout(function() { 
     alert(it); 
    }, 1); 
    // End variable captured code 
    })(it) 
} 

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

एकमात्र चीज जो मुझे समाधान के बारे में पसंद नहीं है वह अंत में "इसे" दोहराया जाता है।

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