जावास्क्रिप्ट में फ़ंक्शन मौजूद है या नहीं, इसकी जांच कैसे करें?


533

मेरा कोड है

function getID( swfID ){
     if(navigator.appName.indexOf("Microsoft") != -1){
          me = window[swfID];
     }else{
          me = document[swfID];
     }
}

function js_to_as( str ){
     me.onChange(str);
}

हालांकि, कभी-कभी मेरा onChangeलोड नहीं होता है। फायरबग त्रुटियों के साथ

me.onChange कोई फ़ंक्शन नहीं है

मैं इनायत से नीचा दिखाना चाहता हूं क्योंकि यह मेरे कार्यक्रम की सबसे महत्वपूर्ण विशेषता नहीं है। typeofवही त्रुटि देता है।

यह सुनिश्चित करने के लिए कि यह मौजूद है और फिर केवल निष्पादित कैसे करें, इस पर कोई सुझाव onChange?

(नीचे दिए गए तरीकों में से कोई भी एक काम को पकड़ने की कोशिश को छोड़कर)


1
@SteveChambers मैंने ऐसा किया है। मुझे याद दिलाने के लिए धन्यवाद।
एलेक स्मार्ट


अपवाद को पकड़ना। मेरे उत्तर की जाँच करें
Matteus Barbosa

जवाबों:


1224

कुछ इस तरह की कोशिश करो:

if (typeof me.onChange !== "undefined") { 
    // safe to use the function
}

या अभी तक बेहतर (UpTheCreek upvoted टिप्पणी के अनुसार)

if (typeof me.onChange === "function") { 
    // safe to use the function
}

249
=== 'फंक्शन' से बेहतर होगा! = 'अपरिभाषित'
UpTheCric

3
@ जेम्स, क्योंकि यह कथन वास्तव undefinedमें जावास्क्रिप्ट में एक अपवाद फेंकता है । मैं इसे करने की कोशिश की।
माइक Perrenoud

8
@UpTheCreek, यह एक सामान्य समाधान के रूप में थोड़ा खतरनाक होगा क्योंकि IE के पुराने संस्करणों वस्तुओं, जैसे कुछ कार्यों का इलाज करते हैं typeof window.alert === 'object'
13

1
सिर्फ उपयोग क्यों नहीं if (me.onChange) { // do something }?
बॉर्नटूकोड

3
@BornToCode क्योंकि तब me.onChangeकुछ भी मूल्यांकन किया जा सकता है true, जरूरी नहीं कि एक फ़ंक्शन (जैसे यह एक बूलियन, एक स्ट्रिंग, आदि हो सकता है)। उदाहरण के लिए jsfiddle.net/j5KAF/1
Ohad Schneider

108

मुझे यह समस्या थी।

if (obj && typeof obj === 'function') { ... }

यदि संदर्भ अपरिभाषित हुआ हो तो संदर्भ त्रुटि फेंकते रहें।

अंत में मैंने निम्नलिखित कार्य किए:

if (typeof obj !== 'undefined' && typeof obj === 'function') { ... }

एक सहयोगी ने मुझे करने के लिए कहा कि पता चल सके कि यह है !== 'undefined'और उसके बाद === 'function'निश्चित रूप से अनावश्यक है।

सरल:

if (typeof obj === 'function') { ... }

बहुत क्लीनर और महान काम करता है।


1
किसी को भी विचार है कि पहला कोड स्निपेट क्यों फेंकता है ReferenceError? जो मुझे अतार्किक लगता है।
कहाफगन

@saidfagan ReferenceError डेवलपर.
Misha Nasledov

यह मेरे लिए काम करता है
NewBie1234

1
कोई भी मकसद क्यों टाइपोफ़ ओब्ज == 'फ़ंक्शन' अपर्याप्त होगा? ;-) अनुस्मारक: सख्त समानता परीक्षण ऑपरेटर केवल तभी समझ में आता है जब स्थिर ओपेरा खाली या अशक्त हो या 0 या इस तरह के किसी भी कास्ट amalgame के अधीन।
फाबिन हदादी

16

यदि आप एक स्ट्रिंग को फ़ंक्शन में बदलने के लिए eval का उपयोग कर रहे हैं, और आप यह जांचना चाहते हैं कि क्या यह eval'd विधि मौजूद है, तो आप एक eval के अंदर टाइपोफ़ और अपने फ़ंक्शन स्ट्रिंग का उपयोग करना चाहते हैं :

var functionString = "nonexsitantFunction"
eval("typeof " + functionString) // returns "undefined" or "function"

इसे उल्टा न करें और eval पर टाइपोफ की कोशिश करें । यदि आप एक संदर्भ करते हैं तो आपको फेंक दिया जाएगा:

var functionString = "nonexsitantFunction"
typeof(eval(functionString)) // returns ReferenceError: [function] is not defined

21
eval == बुराई;)
यति

1
यह बुराई हो सकती है, लेकिन यह तब बहुत सहायक होता है जब फ़ंक्शन का नाम एक चर में होता है।
ल्यूक कजिन्स

8
आप इसे बिना निष्कासन के कर सकते हैं। उदाहरण:var a = 'alert'; window[a]('it works');
जेनिन

15

कैसा रहेगा:

if('functionName' in Obj){
    //code
}

जैसे

var color1 = new String("green");
"length" in color1 // returns true
"indexOf" in color1 // returns true
"blablabla" in color1 // returns false

या अपने मामले के लिए के रूप में:

if('onChange' in me){
    //code
}

MDN डॉक्स देखें ।


लेकिन यह समाधान हर बार काम नहीं कर रहा है :( उदाहरण के लिए अगर मैं यह जानना चाहता हूं कि यह lastIndexOf()स्ट्रिंग में है (हम जानते हैं, कि है, लेकिन सैद्धांतिक रूप से) typeof String().lastIndexOf === "function"यह सच है, लेकिन 'lastIndexOf' in Stringगलत है।
iiic

10

कोशिश करें typeof- 'undefined'कहने के लिए देखो यह 'function'एक समारोह के लिए मौजूद नहीं है । इस कोड के लिए JSFiddle

function thisishere() {
    return false;
}
alert("thisishere() is a " + typeof thisishere);
alert("thisisnthere() is " + typeof thisisnthere);

या यदि

if (typeof thisishere === 'function') {
    // function exists
}

या वापसी मूल्य के साथ, एक ही लाइन पर:

var exists = (typeof thisishere === 'function') ? "Value if true" : "Value if false";
var exists = (typeof thisishere === 'function') // Returns true or false

9

यह सुझाया नहीं गया: me.onChange && me.onChange (str);

मूल रूप से अगर me.onChange अपरिभाषित है (जो कि यदि यह आरंभ नहीं किया गया है) तो यह बाद वाले हिस्से को निष्पादित नहीं करेगा। यदि me.onChange एक फ़ंक्शन है, तो यह me.onChange (str) को निष्पादित करेगा।

आप और भी आगे बढ़ सकते हैं:

me && me.onChange && me.onChange(str);

अगर मेरे पास भी ऐसा ही हो


5
//Simple function that will tell if the function is defined or not
function is_function(func) {
    return typeof window[func] !== 'undefined' && $.isFunction(window[func]);
}

//usage

if (is_function("myFunction") {
        alert("myFunction defined");
    } else {
        alert("myFunction not defined");
    }

आपका समाधान स्पष्ट नहीं है, क्योंकि इसमें जर्कट्री है, जो इस समय मुझे अजीब लगता है, इसलिए यह सरल परीक्षण करते समय त्रुटियों को फेंकता है।
टोडुआ

@tazotodua यह स्व व्याख्यात्मक कार्य है। यदि आप jquery के बिना उपयोग करना चाहते हैं। बस && भाग निकालें। यह जाँच करने और त्रुटियों से बचने के लिए एक अतिरिक्त शर्त है।
मुहम्मद ताहिर

क्या बाईं ओर स्थित स्थिति &&कुछ इस बात का ध्यान रखती है कि jQuery के isFunctionदाईं ओर &&क्या नहीं है?
शांतिबेलर्स

5

मेरे लिए सबसे आसान तरीका:

function func_exists(fname)
{
  return (typeof window[fname] === 'function');
}

यह सही उत्तर है, क्योंकि यह एक स्ट्रिंग लिबरल है .. मैं इसे इस तरह से बेहतर कहूंगा if ((typeof window["function_name"] !== 'undefined') && ((typeof window["function_name"] === 'function'))) { return true; } else { return false; }लेकिन यह एक मामूली समायोजन है
श्री हील्स

4

मैं यह सुनिश्चित करने के लिए कि संपत्ति वास्तव में एक फ़ंक्शन है, मैं 1 कदम आगे जाऊंगा

function js_to_as( str ){
     if (me && me.onChange && typeof me.onChange === 'function') {
         me.onChange(str);
     }
}


3

मुझे इस विधि का उपयोग करना पसंद है:

function isFunction(functionToCheck) {
  var getType = {};
  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}

उपयोग:

if ( isFunction(me.onChange) ) {
    me.onChange(str); // call the function with params
}

3

Underscore.js पुस्तकालय इसे इस तरह से परिभाषित करता है, क्योंकि यह (कुछ टिप्पणियों के अनुसार ब्राउज़र के बगों को पूरा कर सकता है)

typeof obj == 'function' || false

http://underscorejs.org/docs/underscore.html#section-143


3
function function_exists(function_name)
{
    return eval('typeof ' + function_name) === 'function';
}
alert(function_exists('test'));
alert(function_exists('function_exists'));

या

function function_exists(func_name) {
  //  discuss at: http://phpjs.org/functions/function_exists/
  // original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // improved by: Steve Clay
  // improved by: Legaev Andrey
  // improved by: Brett Zamir (http://brett-zamir.me)
  //   example 1: function_exists('isFinite');
  //   returns 1: true

  if (typeof func_name === 'string') {
    func_name = this.window[func_name];
  }
  return typeof func_name === 'function';
}

1
कृपया, कुछ स्पष्टीकरण।
गुफरान हसन

दो मामलों में, अस्तित्व की जाँच करने के लिए फ़ंक्शन पैरामीटर के नाम के साथ बस function_exists को कॉल करें , रिटर्न बूल।
मोहम्मद लोटी

3

डबल विस्मय बोधक चिह्न रखो !! फ़ंक्शन नाम से पहले जिसे आप जांचना चाहते हैं। यदि यह मौजूद है, तो यह सच हो जाएगा।

function abc(){
}
!!window.abc; // return true
!!window.abcd; // return false

3

कुछ शब्दों में: अपवाद को पकड़ें।

मैं वास्तव में हैरान हूं कि किसी ने भी इस पोस्ट पर एक्सेप्शन कैच के बारे में कोई जवाब नहीं दिया या टिप्पणी नहीं की।

विवरण: यहां एक उदाहरण दिया गया है जहां मैं एक फ़ंक्शन से मेल खाने की कोशिश करता हूं जो मास्क_ द्वारा उपसर्ग किया जाता है और "फ़ील्ड" नाम से प्रत्यय होता है। जब जावास्क्रिप्ट को फ़ंक्शन नहीं मिलता है, तो उसे एक संदर्भError फेंकना चाहिए जिसे आप पकड़ अनुभाग पर अपनी इच्छानुसार संभाल सकते हैं।

function inputMask(input) {
  try {
    let maskedInput = eval("mask_"+input.name);

    if(typeof maskedInput === "undefined")
        return input.value;
    else
        return eval("mask_"+input.name)(input);

  } catch(e) {
    if (e instanceof ReferenceError) {
      return input.value;
    }
  }
}



2

मुझे संदेह होगा कि meसही ढंग से ओन लोड नहीं हो रहा है।

ऑनक्लिक ईवेंट में get_ID कॉल को आगे बढ़ाते हुए इसका ध्यान रखना चाहिए।

स्पष्ट रूप से आप पहले बताए गए अनुसार आगे फँस सकते हैं:

function js_to_as( str) {
  var me = get_ID('jsExample');
  if (me && me.onChange) {
    me.onChange(str);
  }
}

2

मैं हमेशा इस तरह की जाँच करता हूँ:

if(!myFunction){return false;}

इस फ़ंक्शन का उपयोग करने वाले किसी भी कोड से पहले इसे रखें


2

मेरे पास ऐसा मामला था जहां फ़ंक्शन का नाम एक चर (इस मामले में var 'x') के अनुसार भिन्न था, फ़ंक्शन नाम में जोड़ा गया। यह काम:

if ( typeof window['afunction_'+x] === 'function' ) { window['afunction_'+x](); } 


2

मैंने स्वीकृत उत्तर की कोशिश की है; तथापि:

console.log(typeof me.onChange);

'अपरिभाषित' देता है। मैंने देखा है कि विनिर्देश 'onChange' (ऊंट नोटिस नोटिस) के बजाय 'onchange' नामक एक घटना बताता है।

मेरे लिए काम करने वाले मूल स्वीकृत उत्तर को बदलना:

if (typeof me.onchange === "function") { 
  // safe to use the function
}

2

यदि आप एक फ़ंक्शन के लिए जाँच कर रहे हैं जो एक jQuery प्लगइन है, तो आपको $ .fn.myfunction का उपयोग करने की आवश्यकता है

if (typeof $.fn.mask === 'function') {
    $('.zip').mask('00000');
}

2

मैं भी इस समस्या का एक सुंदर समाधान ढूंढ रहा हूं। बहुत प्रतिबिंब के बाद, मुझे यह दृष्टिकोण सबसे अच्छा लगा।

const func = me.onChange || (str => {}); func(str);


यदि आप मिनिमिज़म के लिए जा रहे हैं, तो आप यह भी कर सकते हैं: (me.onChange||(_=>_))()यदि यह मौजूद है तो फ़ंक्शन निष्पादित करेगा, अन्यथा कुछ भी नहीं करेगा।
JSideris

me.onChange && me.onChange()एक शून्य फ़ंक्शन को परिभाषित करने से रोकना बेहतर है।
necrifede

2

बचाव के लिए आधुनिक जावास्क्रिप्ट!

यह उत्तर की लंबी सूची के साथ देखे जाने का एक बड़ा मौका नहीं हो सकता है, लेकिन यह अब भाषा स्तर पर * नए वैकल्पिक चैनिंग सिंटैक्स के साथ हल हो गया है

me.onChange?.(str)

यह उतना ही सरल है - onChangeकेवल मौजूद होने पर कॉल किया जाता है

यदि onChangeअस्तित्व में नहीं है, तो कुछ भी नहीं होता है, और अभिव्यक्ति वापस आती है undefined- इसलिए यदि इसका वापसी मूल्य है जो आप अन्यथा उपयोग करेंगे, तो आप बस इस मूल्य की जांच कर सकते हैं!== undefined जारी रखने से पहले ।

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

* ठीक है, तकनीकी रूप से वैकल्पिक चेंजिंग चेंजिंग अभी भी एक स्टेज 4 TC39 प्रपोजल है, जो अभी तक ECMAScript स्पेक में नहीं है, लेकिन स्टेज 4 का मतलब है कि इसे अंतिम रूप दिया गया है और इसके शामिल होने की अनिवार्य रूप से गारंटी है, यह सिर्फ एक नए वर्जन के शिप होने का इंतजार कर रहा है। आप इसके अंतिम संस्करण में वाक्य रचना का उपयोग आज कर सकते हैं बबल के माध्यम से विश्वास के साथ यह नहीं बदलेगा। यह टाइपस्क्रिप्ट में भी है!


1

एक फ़ंक्शन के अस्तित्व की जाँच करने और उस फ़ंक्शन को गतिशील रूप से दूसरे फ़ंक्शन द्वारा ट्रिगर करने के लिए एक कार्यशील और सरल समाधान है ;

ट्रिगर समारोह

function runDynamicFunction(functionname){ 

    if (typeof window[functionname] == "function") { //check availability

        window[functionname]("this is from the function it"); // run function and pass a parameter to it
    }
}

और अब आप इस तरह से php का उपयोग करके गतिशील रूप से फ़ंक्शन उत्पन्न कर सकते हैं

function runThis_func(my_Parameter){

    alert(my_Parameter +" triggerd");
}

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

<?php

$name_frm_somware ="runThis_func";

echo "<input type='button' value='Button' onclick='runDynamicFunction(\"".$name_frm_somware."\");'>";

?>

सटीक HTML कोड आपको चाहिए

<input type="button" value="Button" onclick="runDynamicFunction('runThis_func');">

0
    function sum(nb1,nb2){

       return nb1+nb2;
    }

    try{

      if(sum() != undefined){/*test if the function is defined before call it*/

        sum(3,5);               /*once the function is exist you can call it */

      }

    }catch(e){

      console.log("function not defined");/*the function is not defined or does not exists*/
    }

0

और फिर यह है ...

( document.exitPointerLock || Function )();

हैलो मास्टर, एक अच्छा है, लेकिन आप अपवाद को पकड़ने के बारे में क्या सोचते हैं? मेरे उत्तर की जाँच करें
Matteus Barbosa

नोट के लिए धन्यवाद। आपका समाधान सराहनीय है। मैं जब भी संभव हो या आसान 'ट्राइ-कैच' प्रतिमान से बचने की कोशिश करता हूं, या हो सकता है कि इसे 3 जी सहायता सहायता द्वारा निहित / लगाया गया हो। 'एवैल' को भी कई कारणों से भुनाया जाता है, जैसे एक समय में दूसरे रैपर को पकड़ने की कोशिश करना। वहाँ से बाहर निकालने के विकल्प हैं जो 'फेंक' भी सकते हैं। मुझे लगता है कि 'नया फंक्शन (पार्म्स, बॉडी)' शायद आपको एक त्रुटि देगा, लेकिन मुझे लगता है कि मेरे लिए अगला सवाल स्पीड तुलना है, अन्य तो बस सबसे अच्छा कोड आकार में कमी (मेरे लिए तेजी से मतलब है)। [हम्म यह नया लगता है। मैंने इसे jsben.ch की कोशिश नहीं की है]
मास्टर जेम्स

इसके बजाय नए फ़ंक्शन को कॉल करने के बारे में mmm रैली दिलचस्प बिंदु है। मेरे उत्तर के लिए अपने परिवर्तन सुझाव प्रस्तुत करने के लिए स्वतंत्र महसूस करें। बहुत बहुत धन्यवाद
मैट्टस बारबोसा

हां मेरा मतलब है कि 'स्रोत myScript.sh' का उपयोग करने पर भी आप को एलियास इत्यादि के माध्यम से 'एक्सपोर्ट' किया जा सकता है, यह कक्षाओं और पुस्तकालयों की तरह हमेशा किसी भी और सभी कोड की एक अंतर्निहित संपत्ति रही है। यदि आपके पास यह सुनिश्चित करने के लिए अनुमोदित नहीं है, तो आपके पास एक जेएस दुभाषिया चेक कोड होना चाहिए। मैंने एक एकल फ़ंक्शन में एक बनाया, जो कोड की सबसे सरल स्वयंसिद्ध प्रकृति को समझने में मदद करने के लिए एक और मजेदार चुनौती है, और यहां तक ​​कि एक रन-टाइम किसी की क्षमता से परे नहीं है।
मास्टर जेम्स

0

इसको आजमाओ:

Window.function_exists=function(function_name,scope){
//Setting default scope of none is provided
If(typeof scope === 'undefined') scope=window;
//Checking if function name is defined
If (typeof function_name === 'undefined') throw new 
Error('You have to provide an valid function name!');
//The type container
var fn= (typeof scope[function_name]);
//Function type
If(fn === 'function') return true;
//Function object type
if(fn.indexOf('function')!== false) return true; 
return false;
}

ध्यान रखें कि मैंने इसे अपने सेलफोन के साथ लिखा है, इसमें कुछ अपरकेस मुद्दे और / या अन्य सुधार हो सकते हैं जैसे उदाहरण कार्यों के लिए आवश्यक

यदि आप चाहते हैं कि var सेट है तो जाँचने के लिए PHP जैसा फंक्शन:

Window.isset=function (variable_con){
If(typeof variable_con !== 'undefined') return true;
return false;
}

0

पूर्ववर्ती उत्तरों को स्पष्ट करने के लिए, यहाँ एक त्वरित JSFiddle स्निपेट:

function test () {
console.log()

}

console.log(typeof test) // >> "function"

// implicit test, in javascript if an entity exist it returns implcitly true unless the element value is false as :
// var test = false
if(test){ console.log(true)}
else{console.log(false)}

// test by the typeof method
if( typeof test === "function"){ console.log(true)}
else{console.log(false)}


// confirm that the test is effective : 
// - entity with false value
var test2 = false
if(test2){ console.log(true)}
else{console.log(false)}

// confirm that the test is effective :
// - typeof entity
if( typeof test ==="foo"){ console.log(true)}
else{console.log(false)}

/* Expected :
function
true 
true 
false
false
*/


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