2009-06-24 11 views
6

मैं एक वेब पेज पर काम कर रहा हूं जो डोजो का उपयोग करता है और इसमें परियोजना विजेट के एक नंबर (मेरे परीक्षण मामले में 6, लेकिन सामान्य रूप से चर) है। मैं dojo.addOnLoad लागू कर रहा हूँ (init), और मेरे init() फ़ंक्शन में मैं इन पंक्तियों के होते हैं:मैं जावास्क्रिप्ट में लूप क्यों नहीं डाल सकता?

dojo.connect(dijit.byId("project" + 0).InputNode, "onChange", function() {makeMatch(0);}); 
dojo.connect(dijit.byId("project" + 1).InputNode, "onChange", function() {makeMatch(1);}); 
dojo.connect(dijit.byId("project" + 2).InputNode, "onChange", function() {makeMatch(2);}); 
dojo.connect(dijit.byId("project" + 3).InputNode, "onChange", function() {makeMatch(3);}); 
dojo.connect(dijit.byId("project" + 4).InputNode, "onChange", function() {makeMatch(4);}); 
dojo.connect(dijit.byId("project" + 5).InputNode, "onChange", function() {makeMatch(5);}); 

और घटनाओं को बदलने के लिए अपने प्रोजेक्ट को ठीक से makeMatch समारोह आह्वान विजेट। लेकिन अगर मैं उन्हें एक पाश के साथ बदलें:

for (var i = 0; i < 6; i++) 
    dojo.connect(dijit.byId("project" + i).InputNode, "onChange", function() {makeMatch(i);}); 

ही makeMatch() फ़ंक्शन, एक ही init() मंगलाचरण, और एक ही सब कुछ - बस एक पाश में अपने कॉल रोलिंग अप - makeMatch समारोह कभी नहीं कहा जाता है; वस्तुओं को तारित नहीं किया जाता है।

क्या चल रहा है, और मैं इसे कैसे ठीक करूं? मैंने dojo.query का उपयोग करने का प्रयास किया है, लेकिन इसका व्यवहार लूप केस के समान है।

उत्तर

11

इस एक आम समस्या है बंद होने से निपटने पर। इसे आजमाएं:

for (var i = 0; i < 6; i++) { 
    (function(i){ 
     dojo.connect(dijit.byId("project" + i).InputNode, "onChange", function() {makeMatch(i);}); 
    }(i)); 
} 
+0

उत्कृष्ट; धन्यवाद; यह पूरी तरह से काम करता है। मुझे लगता है कि बंद होने को समझने में मुझे लंबा समय लगेगा। –

+6

"जावास्क्रिप्ट द गुड पार्ट्स" नामक पुस्तक प्राप्त करें और आप अन्य चीजों के साथ बंदियों को समझेंगे। – mkoryak

+0

धन्यवाद; मैं इसके लिए देख लूंगा। –

8

मैं लूप के अंदर एक स्थानीय चर है। जब onChange समारोह कहा जाता है, सभी 6 कार्यों मैं के लिए एक संदर्भ है, जो है 6.

यह जो प्रिंट के रूप में #4 on Jon Skeet's C# Brainteaser's page

List<Printer> printers = new List<Printer>(); 
for (int i=0; i < 10; i++) 
{ 
    printers.Add(delegate { Console.WriteLine(i); }); 
} 

foreach (Printer printer in printers) 
{ 
    printer(); 
} 

एक ही समस्या है है सभी 10 की

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