2011-05-31 19 views
18

मैं कुछ जावास्क्रिप्ट कोड है:जावास्क्रिप्ट अज्ञात फ़ंक्शन पैरामीटर गुजर (एक वस्तु के अंदर) के

toggle: function() { 
    var me = this; 
    var handler = function() { me.progress() }; 
    me.intervalId = setInterval(handler, me.intervalTime); 
    //...More code 
} 

मैं जावास्क्रिप्ट के लिए नए की तरह है, तो जहाँ तक मैं वास्तव में बता सकते हैं इसके बाद के संस्करण कर रही हूँ गुजरता me चर अज्ञात समारोह में। मैं यह देखना चाहता था कि ऐसा करने के लिए कोई और घोषणात्मक तरीका है या नहीं? मैं लाइन के साथ कुछ चाहता था:

var handler = (function(o) { o.progress();})(this)); 

लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है ... क्या मुझे कुछ याद आ रही है? क्या यह एक ऐसा मामला है जहां "भाषा जिस तरह से काम करती है, बस एक स्थानीय चर घोषित करें और इसके साथ सौदा करें"?

अद्यतन:

मेरी समस्या के लिए स्रोत था/जावास्क्रिप्ट में गुंजाइश और बंद होने की मेरी स्पष्ट नहीं समझ है। मुझे थोड़ा और समझने में मदद के लिए this article मिला।

+1

यह काम नहीं कर रहा है क्योंकि आपके पास बहुत कुछ है। 'Var हैंडलर नहीं है = (फ़ंक्शन (ओ) {o.progress();}) (यह); शायद काम? – pimvdb

उत्तर

26

आप ".bind()" का उपयोग कर सकते हैं:

var handler = function() { this.progress(); }.bind(this); 

नए ब्राउज़रों "बाँध()" है, और Mozilla docs एक ठोस कार्यान्वयन आप पुराने ब्राउज़र पैच करने के लिए उपयोग कर सकते हैं।

+3

मेरी स्थिति के लिए एक और भी अधिक समाधान है 'var handler = this.progress.bind (this) '। आपके सहयोग के लिए धन्यवाद! – Jose

+0

ओह ठीक है :-) अच्छा बिंदु। – Pointy

1

आपके पास क्या बंद है। handler को बनाया गया और असाइन किया गया फ़ंक्शन me ऑब्जेक्ट का संदर्भ रखता है। यह सामान्य, हर रोज़ जावास्क्रिप्ट है, और यही वह तरीका है जो सामान्य रूप से बंद हो जाता है।

+1

उसकी समस्या नहीं है। वह शिकायत कर रहा है कि 'इसे' बंद नहीं किया जा सकता है, उसे 'var me = this'' पर मजबूर कर रहा है। – hugomg

+0

मैं सहमत हूं, लेकिन वह भाषा से लड़ने के लिए क्या करना चाहता है। I - और शायद हर कोई जो जावास्क्रिप्ट कोड लिखता है - स्थानीय वैरिएबल असाइनमेंट के बिना करना चाहता है, लेकिन यह वही है। –

5

कारण क्योंकि यह तुरंत, anon फ़ंक्शन को कॉल इसलिए तुरंत बुला o.progress() और handler को शीघ्र समारोह (अपरिभाषित) की वापसी मान नियत

var handler = (function(o) { o.progress();})(this)); 

काम नहीं करता। आप बाहरी समारोह से एक वास्तविक समारोह वापस जाने के लिए की जरूरत है: (

handler = (function(me){ 
    return function(){ 
     return me.progress(); 
    } 
}(this)); 

दूसरा पहलू यह बराबर है और बस के रूप में बुरा के रूप में बुरा चर काम के रूप में देख रहे हैं के लिए देख रहा है पर, लेकिन अभी भी उपयोगी हो सकता है, खासकर अगर यह करने की जरूरत है एक लूप में किया जाना चाहिए, इसे ठीक करने के बजाए बदलते हुए)।


BTW, अगर प्रगति समारोह this इसके अंदर करने के लिए किसी भी कॉल नहीं है, बस handler = this.progress (कोष्ठक) के बिना कर पर्याप्त हो सकता है।

0

क्या आपने इस तरह के फ़ंक्शन को वापस करने का प्रयास किया है?

var handler = function(o){ 
    return function(){ 
     o.progress(); 
    } 
}(me); 

अब आप कॉल कर सकते हैं:

handler(); 
5

गुमनाम समारोह me की पहुंच है क्योंकि यह बाहरी समारोह (toggle समारोह) के अंदर घोषित किया जाता है; यह बाहरी समारोह द्वारा पर बंद है।

आपका handler फ़ंक्शन setInterval द्वारा कॉल किया जाएगा, जो बिल्कुल शून्य तर्क पास करता है।इसका मतलब है कि आप हैंडलर फ़ंक्शन में पैरामीटर का उपयोग नहीं कर सकते हैं।

मैं तुम्हें वास्तव मेंme स्पष्ट रूप से पास करना चाहते हैं, तो आप एक समारोह एक पैरामीटर को स्वीकार लिख सकता है, और कहा कि समारोह पैरामीटर के बिना एक गुमनाम समारोह वापसी है, लेकिन निर्माता समारोह के पैरामीटर का उपयोग कर सकता है जो:

toggle: function() { 
    var me = this; 
    var handler = (function (o) { return function() { o.progress() }; })(me); 
    me.intervalId = setInterval(handler, me.intervalTime); 
    //...More code 
} 

लेकिन यह मूल रूप से इसे अधिक सुगम बनाने के बिना पुनर्निर्देशन की एक परत जोड़ता है। जब तक आप उस निर्माण समारोह को बाहर खींच नहीं लेते:

function createProgressHandler(o) { 
    return function() { 
     o.progress(); 
    }; 
} 

// ... 

toggle: function() { 
    var me = this; 
    var handler = createProgressHandler(me); 
    me.intervalId = setInterval(handler, me.intervalTime); 
    //...More code 
} 
संबंधित मुद्दे