मेरे पास एक दिया गया फ़ंक्शन है जो अन्य तर्कों के बीच, दो वैकल्पिक तर्क जो कार्य हो सकता है। दोनों को वैकल्पिक होने की आवश्यकता है, एक कार्य होगा, और कोई भी एक बुलियन या एक समारोह होगा जो एक बूलियन लौटाता है।जांचें कि जावास्क्रिप्ट फ़ंक्शन निष्पादित किए बिना वापस आता है या नहीं?
// 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."
, क्योंकि हम जानते हैं कि यह कुछ देता है:
एक अजीब साइड नोट के रूप में, यह हैल्टिंग समस्या (http://en.wikipedia.org/wiki/Halting_problem) के बहुत करीब है जो ट्यूरिंग मशीनों पर अपरिहार्य है। :) – lexicore
हे, आप एक अच्छा मुद्दा लाते हैं। मैं शायद जेएस से बहुत ज्यादा उम्मीद कर रहा हूँ। : पी – Meshaal
यदि उपयोगकर्ता एक बूलियन और एक फ़ंक्शन जो बुलियन लौटाता है, तो उस मामले के लिए, आपको इसकी आवश्यकता हो सकती है कि वे किसी ऑब्जेक्ट में लिपटे तर्कों में गुजरते हैं। 'Obj।func (myvar, mystring, myobj, {boolarg: true, funcarg: my_func_that_returns_bool}); 'या ऐसा कुछ, यह स्पष्ट है कि यह क्या है। फिर उपयोगकर्ता को यह सुनिश्चित करना होगा कि 'my_func_that_returns_bool' जैसा दावा करता है – Brandin