2010-02-10 22 views
5

मुझे अक्सर बांधना पड़ता है? कुछ फ़ंक्शन जिन्हें तर्क की आवश्यकता होती है। मैं जिस समाधान का उपयोग करता हूं वह फ़ंक्शन को एक अज्ञात फ़ंक्शन के अंदर बांधने के लिए लपेट रहा है।जावास्क्रिप्ट अज्ञात फ़ंक्शन को रोकता है?

function foo(arg_0) { 
    // do stuff with: arg_0 
} 

function bar() { 
    var abc; 
    // stuff happens 
    abc = 'some value'; 
    attachEventHandler(elementId, 'click', function(){foo(abc);}); 
} 
bar(); 

वहाँ ऐसा करने का एक और अधिक सुरुचिपूर्ण रास्ता नहीं है?

+0

आपका वाक्य रचना गलत है; आपका मतलब था 'फ़ंक्शन() {foo (abc); }) ' – SLaks

+0

धन्यवाद, – Jacco

उत्तर

10

आप एक curryer, इस तरह बना सकते हैं:

function curry(func) { 
    var functionArgs = Array.prototype.slice.call(arguments, 1); 
    return function() { return func.apply(this, functionArgs); }; 
} 

उपयोग:

attachEventHandler(elementId, 'click', curry(foo, abc)); 

वैकल्पिक रूप से:

Function.prototype.curry = function() { 
    var func = this, functionArgs = arguments; 
    return function() { return func.apply(this, functionArgs); }; 
} 

उपयोग:

attachEventHandler(elementId, 'click', foo.curry(abc)); 
+2

बदल गया अच्छा विचार, धन्यवाद +1 –

+0

क्या इसे क्यूरिए लिखा जाना चाहिए? – SLaks

+0

मैंने कभी नहीं सोचा था कि जावास्क्रिप्ट मुझे भूख लगी है ... –

-2

आप भी कुछ js libs

उदाहरण YUI

के लिए देखो कि तुम क्या

YUI().use('node',function(Y){ 
    Y.one("#elementID").on('click', function(){ 
    // do your stuff here 
    }); 
}); 
+0

यह सवाल का जवाब नहीं देता है। – SLaks

1

कि ठीक है कर ले जाना चाहते हो सकता है। आपके पास अनिवार्य रूप से या "प्रतिनिधि" का उपयोग है।

स्लाक्स 'क्यूरर कुछ अच्छी वाक्य रचनात्मक चीनी है यदि आपको अक्सर एक स्क्रिप्ट के भीतर ऐसा करना होता है।

0

तो आपके कोड में आपके पास एक कार्य foo() है जो तर्क के रूप में एक ईवेंट लेता है? यदि यह सब आप तो अपने attachEventHandler क्या करना चाहते है() बस के रूप में लिखा जा सकता है:

attachEventHandler(elementId, 'click', foo); 

है क्या हो रहा है कि बजाय बुला foo() यह foo के लिए एक संदर्भ गुजर रहा है()

क्या आप यह सोच रहे हैं कि आप क्या सोच रहे हैं?

+0

वह मानकों को करी करने की कोशिश कर रहा है; मेरा मानना ​​है कि उसकी अनाम विधि में 'abc' पैरामीटर केवल गलती से है। – SLaks

1

यदि आप 'करी' पसंद करते हैं तो आप शब्द फ़ंक्शन को छुपा सकते हैं, लेकिन आपकी मूल विधि ओवरहेड के बिना वही काम करती है।

आप गुमनाम समारोह में कोष्ठकों में तर्क की जरूरत नहीं है यह अभी भी दायरे में होता है जब आप है- परिभाषित

abc = 'some value'; 
attachEventHandler(elementId, 'click', function(abc){foo(abc);}) 
could be: 
attachEventHandler(elementId, 'click', function(){foo(abc)}); 
+0

वास्तव में, कोष्ठक में तर्क डालना वही नहीं है।उसका मूल कोड (प्रश्न को संपादित करने से पहले) उस घटना ऑब्जेक्ट को पास करेगा जो अज्ञात फ़ंक्शन को 'foo' को दिया गया है। – SLaks

+0

यह प्रश्न किसी ईवेंट को पास करने के बारे में नहीं था, इसलिए, इस मामले में आपका उत्तर स्पॉट पर है। अगर मैं एक घटना उत्तीर्ण करना चाहता था, तो पहला समाधान दूसरे से अलग होगा। – Jacco

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