2014-09-09 8 views
5

मेरे पास एक दिया गया फ़ंक्शन है जो अन्य तर्कों के बीच, दो वैकल्पिक तर्क जो कार्य हो सकता है। दोनों को वैकल्पिक होने की आवश्यकता है, एक कार्य होगा, और कोई भी एक बुलियन या एक समारोह होगा जो एक बूलियन लौटाता है।जांचें कि जावास्क्रिप्ट फ़ंक्शन निष्पादित किए बिना वापस आता है या नहीं?

// Obj.func(variable, String[, Object][, Boolean||Function][, Function]); 
Obj.func = function(other, assorted, args, BoolOrFunc, SecondFunc) { 
    // execution 
}; 

Obj.func(
    [ 
     'some', 
     'data' 
    ], 
    'of varying types', 
    { 
     and: 'some optional arguments' 
    }, 
    function() { 
     if(some condition) { 
      return true; 
     } 
     return false; 
    }, 
    function() { 
     // do things without returning 
    } 
); 

यह मेरी इच्छा है कि दोनों कार्यों (और अन्य तर्कों के कई है, अगर यह मायने रखती है) वैकल्पिक हो, जिसका मतलब है मैं जो तर्क उपयोगकर्ता इरादा उपयोग करने के लिए निर्धारित करने के लिए समारोह में कोड है।

दुर्भाग्य से, दोनों कार्य हो सकते हैं, और सीधे फ़ंक्शन कॉल में निर्दिष्ट किया जा सकता है, मैं बस typeof या instanceof सशर्तयों का उपयोग नहीं कर सकता। हालांकि, पहली समारोह के बाद से, अगर यह मौजूद है, हमेशा एक बूलियन वापस आ जाएगी (और दूसरे समारोह में सभी नहीं लौटेगा), एक विचार मैं था अपनी वापसी मान की जाँच करने होगा:

if(typeof BoolOrFunc === 'boolean' 
    || (typeof BoolOrFunc === 'function' && typeof BoolOrFunc() === 'boolean')) { 
    // BoolOrFunc is either a boolean or a function that returns a boolean. 
    // Handle it as the intended argument. 
} else { 
    // Otherwise, assume value passed as BoolOrFunc is actually SecondFunc, 
    // and BoolOrFunc is undefined. 
} 

यह सिद्धांत में काम करता है; हालांकि, typeof BoolOrFunc() चल रहा है फ़ंक्शन निष्पादित करता है, जो किसी समस्या का कारण बनता है यदि फ़ंक्शन केवल बूलियन लौटने से अधिक करता है: यानी, यदि फ़ंक्शन BoolOrFunc के रूप में पारित किया गया है तो वास्तव मेंSecondFunc होना था। SecondFunc, इस मामले में, कॉलबैक फ़ंक्शन का कुछ है, और डीओएम संशोधनों सहित क्रियाएं कर सकता है, जिसे मैं तुरंत निष्पादित नहीं करना चाहता हूं।

इसी कारण से, मेरा प्रश्न है: क्या यह जांचने का कोई तरीका है कि कोई फ़ंक्शन निष्पादित किए बिना कार्य करता है या नहीं?

एक बात मैं पर विचार किया था BoolOrFunc.toString() कॉल करने के लिए है, तो वापसी मान के लिए एक नियमित अभिव्यक्ति खोज, की तर्ज पर कुछ प्रदर्शन ...

if(typeof BoolOrFunc === 'boolean' 
    || (typeof BoolOrFunc === 'function' 
     && BoolOrFunc.toString().search(/return (true|false);/) !== -1)) { 
    // BoolOrFunc is either a boolean or contains a return string with a boolean. 
    // Handle it as the intended argument. 
} 

ध्यान दें कि उपरोक्त कोड लिखा के अनुरूप कार्य न था: मैंने वास्तव में इसके लिए एक टेस्ट केस नहीं बनाया है, क्योंकि, यह असाधारण रूप से अक्षम और संभावित रूप से अविश्वसनीय लगता है, और मुझे लगता है कि यहां किसी को मेरे विवाद के लिए एक और अधिक शानदार समाधान हो सकता है। ऐसा कहा जा रहा है, मैंने सोचा कि मैं इसे चर्चा उद्देश्यों के लिए शामिल करूंगा। इस भविष्यवाणी समारोह एक ट्यूरिंग मशीन नहीं है के साथ

"... one will either be a boolean or a function that returns a boolean." 
"... first function, if it exists, will always return a boolean." 

, क्योंकि हम जानते हैं कि यह कुछ देता है:

+1

एक अजीब साइड नोट के रूप में, यह हैल्टिंग समस्या (http://en.wikipedia.org/wiki/Halting_problem) के बहुत करीब है जो ट्यूरिंग मशीनों पर अपरिहार्य है। :) – lexicore

+0

हे, आप एक अच्छा मुद्दा लाते हैं। मैं शायद जेएस से बहुत ज्यादा उम्मीद कर रहा हूँ। : पी – Meshaal

+0

यदि उपयोगकर्ता एक बूलियन और एक फ़ंक्शन जो बुलियन लौटाता है, तो उस मामले के लिए, आपको इसकी आवश्यकता हो सकती है कि वे किसी ऑब्जेक्ट में लिपटे तर्कों में गुजरते हैं। 'Obj।func (myvar, mystring, myobj, {boolarg: true, funcarg: my_func_that_returns_bool}); 'या ऐसा कुछ, यह स्पष्ट है कि यह क्या है। फिर उपयोगकर्ता को यह सुनिश्चित करना होगा कि 'my_func_that_returns_bool' जैसा दावा करता है – Brandin

उत्तर

1

Meshaal सवाल में एक भविष्यवाणी कर दिया। निश्चित रूप से यह एक साधारण RegExp के साथ नहीं किया जा सकता है: बस return !0 उदाहरण तोड़ देगा।

लेकिन यदि आप पार्स function.toString() का परिणाम पार्सर के साथ सभी संभावित वापसी बिंदुओं को खोजने के लिए पर्याप्त बुद्धिमान होने के परिणामस्वरूप समस्या को मुख्य रूप से हल करने योग्य होना चाहिए।

0

दिलचस्प सवाल, अगर मैं सही ढंग से समझता हूं। सबसे पहले, मैं शायद ऐसे ओपन-एंडेड तर्कों के खिलाफ चेतावनी दूंगा। मैं उपयोग के मामले के रूप में उत्सुक हूँ।

लेकिन कहा कि, आपके द्वारा उल्लेख की जाने वाली समस्याओं के आसपास पहुंचना काफी आसान है (जो आपकी समस्या को पूरी तरह से हल नहीं कर सकता है)।

यह सिद्धांत रूप में कार्य करता है; हालांकि, चल रहे प्रकार BoolOrFunc() फ़ंक्शन निष्पादित करता है ...

यह ठीक करने के लिए काफी आसान है, मुझे लगता है। सबसे पहले, यह देखने के लिए जांचें कि BoolOrFunc एक बूलियन या फ़ंक्शन है (केवल typeof BoolOrFunc, नाच)। यदि यह एक बूलियन है, तो मुझे लगता है कि हम ठीक हैं। या तो SecondFunc गुम है (undefined) या function - या हम एक त्रुटि स्थिति में हैं। इस पहले मामले में संभालना आसान है।

तो आइए दूसरे मामले को मान लें, कि हमारे पास BoolOrFunc-As-Function है। हमें इसे निष्पादित करना होगा, भले ही यह "वास्तव में" BoolOrFuncयाSecondFunc है, इसलिए, अंतिम कोड पर आपके कोड में संभव है, ऐसा करें।

यह स्पष्ट रूप से है जहां चीजें आपके द्वारा अधिक छद्म कोड (या उत्पादन कोड) के बिना जटिल हो जाती हैं। यदि "संभव BoolOrFunc" true या false देता है, तो आप जानते हैं कि आपके पास BoolOrFunc का फ़ंक्शन वर्जन है। यदि यह undefined देता है, तो आप जानते हैं कि आपने अभी SecondFunc कहा है। फिर, आप जो करने की कोशिश कर रहे हैं उसके आधार पर, आप यहां शाखा बनाते हैं। यदि आपके पास true या false है, तो आपको "BoolOrFunc-as-function" को संसाधित करना होगा, अन्यथा आपने SecondFunc कहा है और संभवतः किया गया है।

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

लेकिन इस विशिष्ट अधिक सामान्य मामले [वैसा] भी मुश्किल नहीं है, जब तक हम असली, निरंतर बूलियन्स return रों में साथ काम कर रहे है। उस स्थिति में, regexp मार्ग काम करेगा - सभी return\s+.*; खोजें और सुनिश्चित करें कि प्रत्येक returntrue या false का पालन करता है। या बस कुल return गणना की तुलना करें return\s+(false|true); के लिए समान है। या कुछ और। और उम्मीद है कि समारोह में जावास्क्रिप्ट अच्छी तरह से बनाया गया है। पहले से ही एक भालू क्या है।

समारोह स्थानीय चर (return MightBeBoolean; बल्कि return true; की तुलना में) लौट सकते हैं, तो आप लगभग टोस्ट रहे हैं - या यदि आप truthiness या falsiness स्वीकार करते हैं, आप लगभग टोस्ट फिर से कर रहे हैं, के बाद से undefined falsey है, और आप नहीं कर सकते BoolOrFunc या SecondFunc (जो हमेशा "झूठी" वापस आते हैं) के बीच अंतर बताएं। यह संभव है, लेकिन किसी भी उचित उपयोग मामले में पार्सर लिखने के लायक नहीं है, जिसे मैं कल्पना कर सकता हूं। और यदि आप ऐसा करने के लिए एक lib आयात कर रहे हैं, शीश। सौभाग्य। लगता है कि काम करने के लिए ओवरकिल की तरह लगता है जो इसकी कॉलिंग में थोड़ा अधिक रक्षात्मक है।

मुझे आश्चर्य है कि तर्क के रूप में पारित किए गए कार्यों को स्वयं Obj.func से तर्क पारित कर दिया गया है, जो चीजों को और भी दिलचस्प बना देगा।

अधिक वास्तविक कोड मिला? ; ^) लेकिन आखिर में मैं आपको सिफारिश कर रहा हूं कि "तर्क के किसी भी झुकाव को पास न करें, जब तक वे क्रम में हों"। मुझे लगता है कि आप संभवतः BoolOrFunc/SecondFunc देर से मूल्यांकन कर सकते हैं। अन्यथा, मुझे यह कहने से नफरत है, लेकिन यहां का जोरदार रूप से कोड करें।

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