इस तरह के पाश पर विचार करें: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);
}
क्या कोई अन्य विकल्प हैं?
+1। हालांकि, आप विधि हस्ताक्षर को बदलकर थोड़ा सा संशोधित कर सकते हैं: 'function (m) {/ * code * /}) (it); ' – Alan
+1, लेकिन क्या कोई मुझे बता सकता है कि यह क्यों काम कर रहा है ?! –
@digorydoo लूप में घोषित फ़ंक्शन कोष्ठक में लपेटा जाता है जिसके बाद कोष्ठक के एक सेट के द्वारा कार्य किया जाता है जो तुरंत कार्य को आमंत्रित करने के लिए कार्य करता है। चूंकि चर को उस फ़ंक्शन पर स्कॉप्ड किया जाता है जिसमें उन्हें घोषित किया जाता है (या किसी फ़ंक्शन के भीतर घोषित नहीं होने पर वैश्विक दायरा), प्रत्येक पुनरावृत्ति में 'it' का मान' m' चर को असाइन किया जाता है जो निष्पादित किए गए फ़ंक्शन पर स्कॉप्ड होता है हाथोंहाथ। –