कैसे बताएं कि जावास्क्रिप्ट फ़ंक्शन परिभाषित है या नहीं


302

यदि आप जावास्क्रिप्ट में एक फ़ंक्शन को परिभाषित करते हैं तो आप कैसे बताएंगे?

मैं ऐसा कुछ करना चाहता हूं

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

लेकिन यह मुझे मिल जाता है

कॉलबैक एक फ़ंक्शन नहीं है

कॉलबैक परिभाषित नहीं होने पर त्रुटि।

जवाबों:


475
typeof callback === "function"

47
यह वास्तव में एक जादुई स्ट्रिंग नहीं है, क्योंकि टाइपो मूल्यों के सेट को ईसीएमए कल्पना में ठीक से परिभाषित किया गया है। हालाँकि इसके लिए वाक्यविन्यास शुरू करने के लिए थोड़ा नासमझ है, यह पूरी तरह से उचित मुहावरेदार जावास्क्रिप्ट है।
बेन ज़ोट्टो

2
@quixoto - समझा जाता है, मुझे लगता है कि मेरा क्या मतलब है कि आपको अभी भी एक तार की परवाह किए बिना की आवश्यकता है - मैं नहीं बल्कि किसी भी अधिक शाब्दिक तार पूरी तरह से जरूरत से ज्यादा अपने कोड कूड़ेदान होगा; इसलिए, यह परीक्षण के लिए मेरा आदर्श नहीं है अगर कुछ एक फ़ंक्शन है।
जेसन बंटिंग

4
और हाँ, "जादू" एक मैला, खराब शब्द विकल्प था - मेरा मतलब था "शाब्दिक स्ट्रिंग" नहीं "जादू स्ट्रिंग"। मेरी गलती। :)
जेसन बंटिंग


अपने फ़ंक्शन पर कोष्ठक को निकालना सुनिश्चित करें और केवल इफ़-कंडीशन में फ़ंक्शन नाम का उपयोग करें या आपको सही या गलत देने के बजाय फ़ंक्शन को लागू किया जाएगा।
रसेल स्ट्रॉस

236

सभी वर्तमान उत्तर शाब्दिक स्ट्रिंग का उपयोग करते हैं, जिसे मैं अपने कोड में संभव नहीं होने पर पसंद करता हूं - यह (और बूट करने के लिए मूल्यवान अर्थ अर्थ प्रदान नहीं करता है):

function isFunction(possibleFunction) {
  return typeof(possibleFunction) === typeof(Function);
}

व्यक्तिगत रूप से, मैं अपने कोड में घूमने वाले तारों की संख्या को कम करने की कोशिश करता हूं ...


इसके अलावा, जब मैं जानता हूं कि typeofएक ऑपरेटर है और एक फ़ंक्शन नहीं है, तो सिंटैक्स का उपयोग करने में थोड़ा नुकसान है जो इसे बाद के रूप में प्रकट करता है।


7
मुझे इस फ़ंक्शन का उपयोग कैसे करना चाहिए? मैंने कोशिश की है कि फ़ंक्शन का नाम isFunction(not_defined))कहां not_definedहै not_defined is not definedजो परिभाषित नहीं है और फायरबग वापस आ गया है जो सही है लेकिन आपका फ़ंक्शन गलत लौटना चाहिए और त्रुटि उत्पन्न नहीं करना चाहिए ...
Wookie88

@ Wookie88: तकनीकी रूप से, मेरे जवाब में सचित्र फ़ंक्शन में कोई त्रुटि नहीं होती है क्योंकि एक त्रुटि होती है क्योंकि जावास्क्रिप्ट दुभाषिया प्रतीक को हल करने का प्रयास कर रहा है not_definedताकि इसके मूल्य को पास किया जा सके isFunction()और इसे हल करने में विफल हो। isFunction()इस समस्या को हल करने की परिभाषा के लिए कुछ भी नहीं किया जा सकता है ।
जेसन बंटिंग

3
@ZacharyYates रेफ़रेंस के आसपास काम करने का तरीका संभवत: परिभाषित नहीं-फ़ंक्शन के संदर्भ में काम करने से बचना होगा। आप फ़ंक्शन कॉल के अंदर टाइपकास्ट कर सकते हैं और फ़ंक्शन को परिणाम पास कर सकते हैं। jsfiddle.net/qNaxJ शायद इतना अच्छा नहीं है, लेकिन कम से कम, कोई तार इस्तेमाल नहीं किया;)
netiul

8
या एक समारोह से बचें isFunctionऔर बस करो (typeof no_function == typeof Function)
netiul

2
@JasonBunting यदि आप उस picky होने जा रहे हैं, तो आपको वास्तव में उपयोग करना चाहिए typeof(Function())क्योंकि फ़ंक्शन एक फ़ंक्शन है; लेकिन एरे, ऑब्जेक्ट और अन्य बिल्ट-इन प्रोटोटाइप हैं (बेहतर अवधि की कमी के लिए)। यदि आप एक ऐसे ऐरे के लिए जाँच कर रहे थे जिसका आप typeof(array) === typeof(Array)उदाहरण के लिए उपयोग नहीं करेंगे ; यदि typeof(array) === typeof(Array())आप वास्तव में सावधान और सुसंगत हैं तो आपको फ़ंक्शन का मूल्यांकन करने की आवश्यकता है क्योंकि आप इसका उपयोग करेंगे ।
श्मशानसन

16
if (callback && typeof(callback) == "function")

ध्यान दें कि कॉलबैक (अपने आप में) मूल्यांकन करने के लिए falseयह है अगर undefined, null, 0, या false। की तुलना nullमें अत्यधिक विशिष्ट है।


2
यह भी ध्यान दें कि यदि callbackस्वयं "झूठे-वाई" मूल्य का मूल्यांकन करता है, तो इसका टाइपोफ़ कभी "फ़ंक्शन" नहीं हो सकता है।
जो

5
@ जो, लेकिन शॉर्ट-सर्कुलेटिंग के कारण, कॉलबैक के गलत होने का मूल्यांकन करने पर वह परीक्षण नहीं किया जाएगा।
Fabio A.

3
यह समाधान काम नहीं कर रहा है, क्योंकि पहली स्थिति तुरंत एक अपवाद को आग लगा देगी। यह किसी वस्तु की संपत्ति के लिए काम कर सकता है: अगर (obj.callback) {...}
Roey

8

अगर किसी फ़ंक्शन को लागू किया जाता है, तो यह बताने में वे तरीके भी विफल हो जाते हैं कि अगर वेरिएबल को परिभाषित नहीं किया गया है, तो हम कुछ अधिक शक्तिशाली का उपयोग कर रहे हैं जो एक स्ट्रिंग प्राप्त करने का समर्थन करता है:

function isFunctionDefined(functionName) {
    if(eval("typeof(" + functionName + ") == typeof(Function)")) {
        return true;
    }
}

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}

मुझे लगता है कि एक अच्छा जवाब है, आप सही हैं, सभी तरीकों से ऊपर विफल रहता है फ़ंक्शन परिभाषित नहीं है।
मट्टो कोंटा

अपरिभाषित संदर्भों से बचने के लिए यह तुच्छ है - केवल typeof window.doesthisexistइसके बजाय देखें doesthisexist। हालाँकि, जैसा कि दिखाया गया है, eval (जो: बुराई है) का उपयोग करना केवल नामित कार्यों के साथ काम करेगा - यह प्रश्न में उपयोग के मामले के साथ काम नहीं करेगा।
AD7six 16

विदित हो कि यह केवल वैश्विक दायरे के साथ काम करता है, जबकि स्वीकृत उत्तर स्थानीय कार्यक्षेत्रों के साथ भी काम कर रहा है।
inf3rno

6

जावास्क्रिप्ट में नया मुझे यकीन नहीं है कि व्यवहार बदल गया है लेकिन जेसन बंटिंग (6 साल पहले) द्वारा दिया गया समाधान संभव नहीं होगा यदि संभव नहीं है।

function isFunction(possibleFunction) {
  return (typeof(possibleFunction) == typeof(Function));
}

यह एक फेंक देगा ReferenceError: possibleFunction is not defined त्रुटि को क्योंकि इंजन संभव प्रतीक को हल करने की कोशिश करता है (जैसा कि जेसन के जवाब में टिप्पणियों में बताया गया है)

इस व्यवहार से बचने के लिए आप केवल उस फ़ंक्शन का नाम पास कर सकते हैं जिसे आप जांचना चाहते हैं कि क्या वह मौजूद है। इसलिए

var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;

यह एक चर सेट करता है या तो वह फ़ंक्शन जिसे आप चेक करना चाहते हैं या खाली ऑब्जेक्ट अगर यह परिभाषित नहीं है और इसलिए ऊपर वर्णित मुद्दों से बचा जाता है।


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

6

प्रयत्न:

if (typeof(callback) == 'function')

HI, चर के प्रकार की तुलना करने के लिए "=" की तुलना में हमेशा "ढीले" का प्रयोग न करें।
जोएल कार्नेइरो

4
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}

4
if ('function' === typeof callback) ...

3
एक बिट पंडिताऊ, और अभी भी एक स्ट्रिंग शाब्दिक उपयोग करता है। कैसे के बारे में if(typeof Function === typeof callback)...? :)
जेसन बंटिंग

@JasonBunting उत्सुक, स्ट्रिंग शाब्दिक का उपयोग करने के साथ गलत है?
बिसेंन

@ बाइसन - जैसा कि मैंने कहा, यह मेरे लिए पांडित्य है, लेकिन यहाँ बात है। मान लें कि आप स्ट्रिंग शाब्दिक के साथ कोड का उपयोग करते हैं, और typeofबाद में कुछ अलग लौटाने के लिए कॉल करते हैं (शायद "फ़ंक्शन" के बजाय "फ़ंक्शन"), जावास्क्रिप्ट के एक नए / अलग कार्यान्वयन के कारण - ऐसा लगता है कि इसकी संभावना कम होगी एक नया / अलग कार्यान्वयन typeof Function === typeof callbackचेक को तोड़ देगा क्योंकि यह एक शब्दार्थ स्तर पर होना चाहिए।
जेसन बंटिंग


4

मैं शायद कर सकता हूं

try{
    callback();
}catch(e){};

मुझे पता है कि एक स्वीकृत जवाब है, लेकिन किसी ने भी इसका सुझाव नहीं दिया। मुझे यकीन नहीं है कि यह मुहावरेदार का वर्णन फिट बैठता है, लेकिन यह सभी मामलों के लिए काम करता है।

नए जावास्क्रिप्ट इंजन में finallyइसके बजाय इस्तेमाल किया जा सकता है।


यह एक साफ शॉर्टकट है! हालांकि यह पूरी तरह से परीक्षण के लिए काम नहीं करेगा यदि कोई फ़ंक्शन मौजूद है या परिभाषित किया गया है (इसे निष्पादित किए बिना भी)।
बीजर

यह सच है। मैंने एक ऐसी स्थिति संभाली जहां कॉलबैक उस निष्पादन बिंदु पर वैकल्पिक है। मैं आमतौर पर typeof callbackवैसे भी उपयोग करता हूं ।
क्वेंटिन एंगेल्स

यह समझ आता है; मैं अपनी सामग्री से अधिक प्रश्न शीर्षक पर ध्यान केंद्रित कर रहा था। कभी-कभी मुझे किसी चीज़ के लिए कई टन परीक्षण करने की कोशिश की सरलता पसंद है। क्या आपको लगता है कि इसका उपयोग करने का कोई तकनीकी नुकसान है, इस मामले में टाइपोफ जैसी कोई चीज? या यह मुख्य रूप से चीजों को अधिक उचित / अपेक्षित तरीके से करने की बात है?
बीजर

1
यदि आप कई प्रकारों के लिए परीक्षण करना चाहते हैं तो अपवाद इतने अच्छे नहीं हैं। उदाहरण के लिए, जिस प्रोजेक्ट पर मैं अभी काम कर रहा हूं, वह यह देखने के लिए एक चर पर कई प्रकार की जाँच का उपयोग करता है कि क्या यह एक फ़ंक्शन, स्ट्रिंग, या जो कुछ भी है। इस परियोजना में मुझे वास्तव में प्रकारों की आवश्यकता है। इसके लिए मैं एक प्रकार की सरणी का उपयोग करता हूं, और जांचता हूंaccepted_types.indexOf(typeof value) !== -1 लिए जांचता हूं कि क्या यह प्रकार की श्रेणी में है। इस स्थिति में अपवाद मेरे विचार में निषेधात्मक होगा।
क्वेंटिन एंगल्स

2

इसे इस्तेमाल करे:

callback instanceof Function

1
काम नहीं करता है। यह अभी भी आपको त्रुटि देगा। उत्तर के रूप में पोस्ट करने से पहले आपको इसे स्वयं आज़माना चाहिए।
vbullinger 19

@vbullinger मैंने अभी क्रोम, फ़ायरफ़ॉक्स और सफारी में फिर से परीक्षण किया है - हर जगह काम करता है। किस इंजन से आपको परेशानी का अनुभव हुआ?
eWolf

फ़ायरफ़ॉक्स। जब आपने कॉलबैक परिभाषित नहीं किया था तो क्या आपने मामले का परीक्षण किया था?
21

ऐसा इसलिए है क्योंकि आप सीधे एक अपरिभाषित चर का संदर्भ दे रहे हैं, जो कभी काम नहीं करता है: pastebin.com/UQz2AmzH
eWolf

3
यह फ़ंक्शन पैरामीटर पर उपयोग किए जाने पर काम करता है, जो कि लेखक ने पूछा है - मुझे लगता है कि ECMAScript गैर-मौजूद चर के मामलों और अपरिभाषित के मान के साथ मौजूदा चर को अलग करता है। इस बारे में अधिक जानना दिलचस्प होगा।
eWolf

2

यदि आप पुस्तकालय के स्रोत @ वेंकट सुधीर रेड्डी एडेडमा का उल्लेख करते हैं, तो आप इसे देख सकते हैं:

_.isFunction = function(obj) {
  return typeof obj == 'function' || false;
};

यह सिर्फ मेरा सुझाव, सुझाव है:>




1

मैं देख रहा था कि कैसे एक jQuery फ़ंक्शन परिभाषित किया गया था और मुझे यह आसानी से नहीं मिला।

शायद इसकी आवश्यकता हो सकती है;)

if(typeof jQuery.fn.datepicker !== "undefined")

जैसा कि type0f($.datepicker) !== undefiledअन्यथा होगाobject
vladkras

0

यदि callback()आप किसी फ़ंक्शन में केवल एक बार नहीं बुला रहे हैं, तो आप पुन: उपयोग के लिए तर्क को आरंभ कर सकते हैं:

callback = (typeof callback === "function") ? callback : function(){};

उदाहरण के लिए:

function something_cool(text, callback) {
    // Initialize arguments
    callback = (typeof callback === "function") ? callback : function(){};

    alert(text);

    if (text==='waitAnotherAJAX') {
        anotherAJAX(callback);
    } else {
        callback();
    }
}

सीमा यह है कि यह हमेशा कॉलबैक तर्क को निष्पादित करेगा हालांकि यह अपरिभाषित है।


0

वैश्विक कार्यों के लिए आप किसी एक evalउत्तर में सुझाए गए के बजाय इसका उपयोग कर सकते हैं ।

var global = (function (){
    return this;
})();

if (typeof(global.f) != "function")
    global.f = function f1_shim (){
        // commonly used by polyfill libs
    };

आप के global.f instanceof Functionरूप में अच्छी तरह से उपयोग कर सकते हैं , लेकिन afaik। Functionअलग-अलग फ्रेम में वसीयत का मूल्य अलग-अलग होगा, इसलिए यह केवल एकल फ्रेम एप्लिकेशन के साथ ठीक से काम करेगा। इसलिए हम आमतौर पर typeofइसके बजाय उपयोग करते हैं। ध्यान दें कि कुछ वातावरणों में typeof fउदाहरण के लिए MSIE 6-8 द्वारा कुछ कार्यों के साथ विसंगतियां भी हो सकती हैंalert में "ऑब्जेक्ट" प्रकार था।

स्थानीय कार्यों द्वारा आप स्वीकृत उत्तर में एक का उपयोग कर सकते हैं। आप परीक्षण कर सकते हैं कि फ़ंक्शन स्थानीय है या वैश्विक भी।

if (typeof(f) == "function")
    if (global.f === f)
        console.log("f is a global function");
    else
        console.log("f is a local function");

प्रश्न का उत्तर देने के लिए, उदाहरण कोड नवीनतम ब्राउजर में त्रुटि के बिना मेरे लिए काम कर रहा है, इसलिए मुझे यकीन नहीं है कि इसके साथ क्या समस्या थी:

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

नोट: मैं callback !== undefinedइसके बजाय का उपयोग करेगा callback != null, लेकिन वे लगभग एक ही है।


0

यदि सभी पिछले जवाबों में फ़ंक्शन को लागू करने के लिए साइड इफेक्ट्स नहीं हैं

यहाँ सबसे अच्छा अभ्यास है

आपके पास फंक्शन है

function myFunction() {
        var x=1;
    }
इसके लिए परीक्षण करने का सीधा तरीका

//direct way
        if( (typeof window.myFunction)=='function')
            alert('myFunction is function')
        else
            alert('myFunction is not defined');
एक स्ट्रिंग का उपयोग करना ताकि आपके पास फ़ंक्शन नाम को परिभाषित करने के लिए केवल एक ही स्थान हो

//byString
        var strFunctionName='myFunction'
        if( (typeof window[strFunctionName])=='function')
            alert(s+' is function');
        else
            alert(s+' is not defined');


0

यदि आप फ़ंक्शन को फिर से परिभाषित करना चाहते हैं, तो फ़ंक्शन चर का उपयोग करना सबसे अच्छा है, जो कि उनके घटना क्रम में परिभाषित किए गए हैं, क्योंकि फ़ंक्शन वैश्विक रूप से परिभाषित किए जाते हैं, चाहे वे जहां भी हों।

एक नया फ़ंक्शन बनाने का उदाहरण जो एक ही नाम के पिछले फ़ंक्शन को कॉल करता है:

A=function() {...} // first definition
...
if (typeof A==='function')
   oldA=A;
A=function() {...oldA()...} // new definition


-2

एक-लाइन समाधान:

function something_cool(text, callback){
    callback && callback();
}

उसका उदाहरण सिर्फ इतना दिखाता है, कि वह चाहता है कि फंक्शन को बुलाया जाए यदि वह परिभाषित है, और यदि यह नहीं है, तो कुछ भी नहीं होता है। jsfiddle.net/nh1cxxg6 फाल्सी / झूठे मूल्यों को वापस लाने वाले कार्य अभी भी कहे जाते हैं। बेशक, यह तब काम नहीं करता जब आप चाहते हैं कि मान लौटाए जाएं।
समीर अलजमोविक

आह, मैंने उसके सवाल को गलत बताया। हालाँकि, यह एक अपवाद का कारण होगा यदि कॉलबैक एक फ़ंक्शन नहीं है।
फ्रैंक ब्रायस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.