2011-08-23 9 views
6

मैं इस जावास्क्रिप्ट अलर्ट 0, 1 और 2 को 3 3 के बजाय कैसे बना सकता हूं?स्थानीय पैरामीटर के साथ गुमनाम कार्य कैसे करें

var vals = [1, 2, 3]; 
for(var i = 0; i < vals.length; i++) 
{ 
    window.setTimeout(function() {alert(i);}, 1000); 
} 

मैं कारण है कि यह ऐसा करता है पता है, लेकिन मैं समझ नहीं कर सकते हैं, गुमनाम कार्य करने के लिए i पारित करने के लिए कैसे।

उत्तर

9

तुम इतनी तरह एक बंद में इस लपेट कर सकते हैं:

var vals = [1, 2, 3]; 

for(var i = 0; i < vals.length; i++) { 
    (function(num) { 
     window.setTimeout(function() {alert(vals[num]);}, 1000); 
    })(i); 
} 

यह प्रयास करें: http://jsfiddle.net/qgL7h/

+0

अच्छा काम। मैंने नोटिस किया कि कभी-कभी संख्या 1, 3, 2 में संख्याओं को सतर्क कर दिया गया था। (शायद क्रोम 13 में इसे 5 बार चलाने में से एक) –

+0

ऑर्डर कोई फर्क नहीं पड़ता, और आपको सेटटाइमआउट के क्रम पर भरोसा नहीं करना चाहिए या वैसे भी अंतराल सेट करें – Tyilo

3
var vals = [1, 2, 3]; 
function makeCallback(i) 
{ 
    return function() {alert(i);}; 
} 
for(var i = 0; i < vals.length; i++) 
{ 
    window.setTimeout(makeCallback(i), 1000); 
} 
+0

आईटी कार्य करेगी, लेकिन के रूप में नहीं मान्य सिंटैक्स 'window.setTimeout' एक समारोह संदर्भ, नहीं निष्पादित करने के लिए एक कोड की आवश्यकता है। – Tyilo

+0

आपको फ़ंक्शन को वापस करने की भी आवश्यकता नहीं है, ऐसा लगता है - मेकॉलबैक – Blazemonger

+1

के अंदर 'अलर्ट (i)' को आग लगाना। makeCallback एक फ़ंक्शन संदर्भ देता है, इसलिए यह काम करेगा। –

0

यह नहीं सख्ती से कार्य करने के लिए मैं पारित करने के लिए आवश्यक है, यह एक को सौंपा जा सकता अंदर स्थानीय var।

var vals = [1, 2, 3]; 

for(var i = 0; i < vals.length; i++) { 
    (function() { 
     var num = i 
     window.setTimeout(function() {alert(vals[num]);}, 1000); 
    })(); 
} 

"फ़ंक्शन() {block}()" आवश्यक था, क्योंकि जावास्क्रिप्ट में उचित ब्लॉक अक्षीय चर नहीं थे। हाल के संस्करण, "चलो" जोड़ लिया है जो इस संभव बनाता है:

var vals = [1, 2, 3]; 

for(var i = 0; i < vals.length; i++) { 
    let num = i 
    window.setTimeout(function() {alert(vals[num]);}, 1000); 
} 
संबंधित मुद्दे