2010-12-16 18 views
10

प्रश्नपास फ़ंक्शन कॉलबैक करने

कैसे किसी कॉलबैक फ़ंक्शन से जहां से उसे बनाया गया था एक स्थानीय चर को बनाए रखने कर सकते हैं?

सरल उदाहरण

मैं एक वीडियो प्लेयर बना रहा हूं। संतृप्ति, विपरीत, और रंग को नियंत्रित करने के लिए इसमें स्लाइडर्स होंगे। जब उपयोगकर्ता स्लाइडर के साथ खेलता है, तो उसे यह स्वीकार करने की आवश्यकता होती है कि कौन सा स्लाइडर बदल गया है और यह किस मूल्य में बदल गया है। समस्या यह है कि स्लाइडर का नाम इस पर निर्माता कॉलबैक के दायरे से एक स्थानीय चर है। यह कॉलबैक स्लाइडर का नाम कैसे बनाए रख सकता है?

एचटीएमएल

<div id="saturation"> 
<div class="track"></div> 
    <div class="knob"></div> 
</div> 
</div> 

<div id="contrast"> 
<div class="track"></div> 
    <div class="knob"></div> 
</div> 
</div> 

<div id="hue"> 
<div class="track"></div> 
    <div class="knob"></div> 
</div> 
</div> 

जे एस

var elements = [ 
'saturation', 
'contrast', 
'gamma' 
]; 

for(var i = 0; i < sliders.size(); i++) { 
new Control.Slider(
    $(elements[i]).down('.knob'), 
    $(elements[i]).down('.track'), { 
    onChange: function(value) { 
    // ERROR: elements[i] is undefined 
    alert(elements[i] + ' has been changed to ' + value); 
    } 
} 
} 

उत्तर

6

एक ही चर, i - जो मूल्य है किया जा रहा है 4 समाप्त होता है - आप पाश अंदर बनाए गए प्रत्येक कार्य करने के लिए बाध्य है। आप किसी अन्य समारोह है कि आप मौके पर ही फोन में समारोह लपेटो और i कि कार्य करने के लिए एक पैरामीटर के रूप गुजारें सकता:

for(var i = 0; i < sliders.size(); i++) { 
new Control.Slider(
    $(elements[i]).down('.knob'), 
    $(elements[i]).down('.track'), { 
    onChange: (function(inner_i) { function(value) { 
    alert(elements[inner_i] + ' has been changed to ' + value); 
    } })(i) 
} 
} 
+0

यह मैं एक सिंटैक्स त्रुटि दे दी है। – JoJo

+3

मेरा मानना ​​है कि यह करने के लिए सही बात है: ऑन चेंज: फ़ंक्शन() { रिटर्न फ़ंक्शन (मान) { अलर्ट (तत्व [i] + मान); } } (तत्व [i]) – JoJo

+0

इस पर ध्यान देने पर मैंने सोचा कि लेखक रिटर्न स्टेटमेंट को छोड़कर चालाक था; लिस्प जैसी भाषाएं डिफ़ॉल्ट रूप से अंतिम अभिव्यक्ति को वापस कर देती हैं। दुर्भाग्यवश जावास्क्रिप्ट उनमें से एक नहीं है :( –

8

प्रत्येक कॉलबैक के लिए चर की एक कॉपी बनानी है, तो आप एक गुमनाम समारोह के साथ ऐसा कर सकते हैं कि आप मान पास: आप सदर्भ नहीं देते

for(var i = 0; i < sliders.size(); i++) { 

    (function(e) { // get a local copy of the current value 

     new Control.Slider(
      $(elements[e]).down('.knob'), 
      $(elements[e]).down('.track'), { 
      onChange: function(value) { 
      // ERROR: elements[e] is undefined 
      alert(elements[e] + ' has been changed to ' + value); 
      } 
     } 

    })(i); // pass in the current value 
} 

इस तरह एक ही i X बार।

0

इस तरह से बंद करने के अंदर अपने समारोह रखो:


for(var i = 0; i < sliders.size(); i++) { 
(function(q){ 
new Control.Slider(
    $(elements[q]).down('.knob'), 
    $(elements[q]).down('.track'), { 
    onChange: function(value) { 
    // ERROR: elements[q] is undefined 
    alert(elements[q] + ' has been changed to ' + value); 
    } 
} 
})(i) 
} 
संबंधित मुद्दे