2011-01-23 16 views
5

में मान के रूप में सरणी अनुक्रमणिका का उपयोग करने का प्रयास करते समय जब मैं कॉलबैक की एक सरणी सेट करता हूं तो मुझे सभी कॉलबैक के लिए संवाद विंडो में 20 मिलते हैं। मैं इसके बजाय सरणी में इंडेक्स प्राप्त करना चाहता हूं। क्या यह संभव है? कॉलबैक को कॉल करने वाला फ़ंक्शन कॉलबैक को एक पैरामीटर होने की उम्मीद कर रहा है। मैं कॉलबैक के कॉलर को नियंत्रित नहीं करता क्योंकि यह बाहरी पुस्तकालय का हिस्सा है। किसी भी मदद की सराहना की है।कॉलबैक की एक सरणी सेट करना और कॉलबैक

for (var i = 0; i < 20; i++) { 
    callbackDB[i] = function(data) { 
    alert(i); 
    } 
} 

उत्तर

11

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

 // returns a function that closes around the `current_i` formal parameter. 
var createFunction = function(current_i) { 
    return function(data) { 
     alert(current_i); 
    }; 
}; 

    // In each iteration, call "createFunction", passing the current value of "i" 
    // A function is returned that references the "i" value you passed in. 
for (var i = 0; i < 20; i++) { 
    callbackDB[i] = createFunction(i); 
} 
+0

मैं createFunction के लिए वर के बजाय कीवर्ड समारोह का उपयोग करने के लिए किया था लेकिन अन्यथा यह एक आकर्षण की तरह काम किया। धन्यवाद! – Xavier

+0

@Xavier: वह सिर्फ मेरे बारे में मैला था। मेरा मतलब था 'var createFunction = function (current_i) {... '। घोषणा के रूप में घोषणा करना 'फ़ंक्शन createFunction (...' भी अच्छा है। – user113716

2

ऑब्जेक्ट का उपयोग करके एक और समाधान।

var callbackDB = new Array(); 
 

 
for (var i = 0; i < 20; i++) { 
 
    callbackDB[i] = { 
 
    value: i, 
 
    callback: function() { 
 
     alert(this.value); 
 
    } 
 
    }; 
 
} 
 
\t \t \t 
 
callbackDB[5].callback();

इस मामले में समारोह (उदाहरण में यह "के लिए कॉलबैक" कहा जाता था) के लिए कॉल करने के लिए जरूरी होगा