জাভাস্ক্রিপ্টে ফাংশন বিদ্যমান কিনা তা কীভাবে পরীক্ষা করবেন?


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
পছন্দ করেছেন আমাকে স্মরণ করার জন্য আপনাকে ধন্যবাদ।
অ্যালেক স্মার্ট


ব্যতিক্রম ধরা। আমার উত্তরটি দেখুন
ম্যাটিউস বারবোসা

উত্তর:


1222

এরকম কিছু চেষ্টা করুন:

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

বা আরও ভাল (আপ ক্রিস upvated মন্তব্য অনুযায়ী)

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

248
=== 'ফাংশন' এর চেয়ে ভাল হবে! = '
অপরিজ্ঞাত

3
@ জেমস, কারণ যে বিবৃতিটি আসলে undefinedজাভাস্ক্রিপ্টে একটি ব্যতিক্রম ছুঁড়েছে । আমি এটা চেষ্টা করেছি.
মাইক পেরেনউড

8
@ ইউপিসক্রিক, সাধারণ সমাধান হিসাবে কিছুটা বিপজ্জনক হবে যেহেতু আইই এর পুরানো সংস্করণগুলি নির্দিষ্ট ফাংশনগুলিকে অবজেক্ট হিসাবে বিবেচনা করে typeof window.alert === 'object'
নয়েও

1
শুধু ব্যবহার if (me.onChange) { // do something }করবেন না কেন ?
বার্নটোকোড

3
@ বার্নটোকোড কারণ তখন me.onChangeমূল্যায়ন করার মতো কিছু হতে পারে true, অগত্যা কোনও ফাংশন নয় (যেমন এটি বুলিয়ান, স্ট্রিং ইত্যাদি হতে পারে)। উদাহরণস্বরূপ jsfiddle.net/j5KAF/1 দেখুন
ওহাদ স্নাইডার

108

আমার এই সমস্যা ছিল

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

যদি আপত্তিটি অপরিজ্ঞাত হয়ে থাকে তবে একটি রেফারেন্স ত্রুটি ছুঁড়ে ফেলেছে।

শেষ পর্যন্ত আমি নিম্নলিখিতগুলি করেছিলাম:

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

একজন সহকর্মী আমার জন্য নির্দিষ্ট যে পরীক্ষণ যদি এটা !== 'undefined'এবং তারপর === 'function'অবশ্যই অপ্রয়োজনীয়।

সহজ:

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

অনেক ক্লিনার এবং দুর্দান্ত কাজ করে।


1
কারও ধারণা আছে কেন প্রথম কোড স্নিপেট ছুড়ে দেয় ReferenceError? এটা আমার কাছে অযৌক্তিক মনে হয়।
ফেব্রুয়ারী


এটি আমার পক্ষে কাজ করে
নিউবি 1212

1
কোনও উদ্দেশ্য কেন টাইপফজ == 'ফাংশন' অপর্যাপ্ত হবে? ;-) অনুস্মারক: স্ট্যাটিক অপারেন্ড খালি বা নাল বা 0 বা এর মতো কোনও castালাই সংশ্লেষের সাপেক্ষে কঠোর সাম্যতা পরীক্ষা অপারেটরটি তখনই বোধগম্য হয়।
ফ্যাবিয়েন হাদ্দাদি

16

আপনি ফাংশন একটি স্ট্রিং রূপান্তর করতে Eval ব্যবহার করছেন, এবং আপনি এই eval'd পদ্ধতি যদি উপস্থিত থাকে চেক করতে চান, আপনি ব্যবহার করতে চাইবেন typeof এবং আপনার ফাংশন স্ট্রিং একটি ভিতরে Eval :

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

এই বিপরীত এবং চেষ্টা করবেন না typeof উপর Eval । আপনি যদি রেফারেন্সইরির করেন তবে নিক্ষেপ করা হবে:

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

21
ইভাল == অশুভ;)
ইয়েতি

1
এটি মন্দ হতে পারে তবে ফাংশনের নামটি যখন ভেরিয়েবলের হয় তখন এটি খুব সহায়ক।
লুক কাজিন্স

8
আপনি এটি ছাড়াই এটি করতে পারেন। উদাহরণ:var a = 'alert'; window[a]('it works');
zennin

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'এই কোডের জন্য জেএসফিডাল

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");
    }

আপনার সমাধানটি পরিষ্কার নয়, কারণ এতে জকিউয়ারি রয়েছে, যা এই মুহুর্তে আমার কাছে বিজোড় বলে মনে হয়, তাই সাধারণ পরীক্ষার সময় এটি ত্রুটি নিক্ষেপ করে।
টুডো

@ তাজোটুডো এটি স্ব-ব্যাখ্যামূলক কাজ। আপনি 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

ইন্ডজোর.জেএস লাইব্রেরি এটি ফাংশন পদ্ধতিতে এটিকে এটি হিসাবে সংজ্ঞায়িত করে (যা মন্তব্যগুলি পরামর্শ দেয় যে কোনও ব্রাউজার বাগগুলি পূরণ করতে পারে)

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 অস্তিত্ব চেক করতে ফাংশন পরামিতির নাম দিয়ে, আয় bool।
মোহাম্মদ লটফি

3

ডাবল বিস্মৃতি চিহ্ন রাখুন অর্থাত্ !! আপনি যে ফাংশনটির নামটি যাচাই করতে চান তার আগে। এটি উপস্থিত থাকলে, এটি সত্য ফিরে আসবে।

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

3

কয়েকটি কথায়: ব্যতিক্রম ধরুন।

আমি সত্যিই অবাক হয়েছি এখনও কেউ এই পোস্টে ব্যতিক্রম ক্যাস সম্পর্কে কোন উত্তর দেয় বা মন্তব্য করেনি।

বিশদ: এখানে একটি উদাহরণ রয়েছে যেখানে আমি এমন কোনও ফাংশনটির সাথে মেলে যাবার চেষ্টা করি যা মুখোশ_ দ্বারা উপস্থাপিত হয় এবং "নাম" ফর্ম ক্ষেত্রের সাথে প্রত্যয়যুক্ত। যখন জাভাস্ক্রিপ্টটি ফাংশনটি খুঁজে পায় না, তখন এটি একটি রেফারেন্স এরির নিক্ষেপ করা উচিত যা আপনি ক্যাচ বিভাগে ইচ্ছামত পরিচালনা করতে পারেন।

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);

'অপরিবর্তিত' প্রদান করে। আমি লক্ষ্য করেছি যে স্পেসিফিকেশনটি 'অনচেনজ' (উটকেস নোট করুন) এর পরিবর্তে 'ইভেন্ট' নামে একটি ইভেন্ট বলে states

নিম্নলিখিতটির স্বীকৃত উত্তরটি পরিবর্তন করা আমার পক্ষে কাজ করেছে:

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()একটি শূন্য ফাংশন সংজ্ঞায়িত করা প্রতিরোধ করা ভাল better
এনক্রিফিডে

2

আধুনিক জাভাস্ক্রিপ্ট উদ্ধার!

উত্তরের দীর্ঘ তালিকার সাথে এটি দেখা পাওয়ার দুর্দান্ত সম্ভাবনা নাও থাকতে পারে তবে ভাষা সমাধানে এটি এখন নতুন ptionচ্ছিক চেইন সিনট্যাক্সের সাহায্যে সমাধান করা হয়েছে

me.onChange?.(str)

এটি এতটা সহজ - onChangeযদি এটি বিদ্যমান থাকে কেবল তখনই তাকে ডাকা হয়

যদি onChange অস্তিত্ব না থাকে তবে কিছুই ঘটে না এবং এক্সপ্রেশনটি ফিরে আসে undefined- সুতরাং যদি এর অন্যটির কোনও মান থাকে যা আপনি অন্যথায় ব্যবহার করতে চান তবে আপনি কেবল এই মানটি পরীক্ষা করতে পারেন!== undefined চালিয়ে যাওয়ার আগে ।

এজ কেস সাবধান - যদি onChange উপস্থিত থাকে তবে তা না একটি ফাংশন, আপনি পেতেTypeError । এটি যেমনটি আপনি প্রত্যাশা করেছিলেন, এটি কোনও ফাংশন হিসাবে কোনও অ-ফাংশনকে কল করার চেষ্টা করার সমান,

* ঠিক আছে, প্রযুক্তিগতভাবে বলতে গেলে ptionচ্ছিক চেইনিং এখনও একটি পর্যায় 4 টিসি 39 এর প্রস্তাবনা তাই এখনও ইসসিএমএসক্রিপটে নির্দিষ্ট নয়, তবে চতুর্থ পর্যায়ের অর্থ এটি চূড়ান্ত হয়েছে এবং এর অন্তর্ভুক্তিটি অবশ্যই গ্যারান্টিযুক্ত, এটি কেবল শিপিংয়ের জন্য নতুন সংস্করণের জন্য অপেক্ষা করছে। আত্মবিশ্বাসের সাথে বাবেলের মাধ্যমে আপনি আজ এর চূড়ান্ত সংস্করণে বাক্য গঠনটি ব্যবহার করতে পারেন এটি পরিবর্তিত হবে না। এটি এমনকি টাইপস্ক্রিপ্ট!


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
    }
}

এবং আপনি এখন এই জাতীয় পিএইচপি ব্যবহার করে গতিশীলভাবে ফাংশন তৈরি করতে পারেন

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

এবং তারপর এই আছে ...

( document.exitPointerLock || Function )();

হ্যালো মাস্টার, ভাল, তবে ব্যতিক্রম ধরা সম্পর্কে আপনি কী ভাবেন? আমার উত্তরটি দেখুন
ম্যাটিউস বারবোসা

নোটের জন্য হাই ধন্যবাদ আপনার সমাধান প্রশংসনীয়। আমি যখনই সম্ভব বা সহজতর 'ট্রাই-ক্যাচ' দৃষ্টান্ত এড়াতে চেষ্টা করেছি বা এটি কোনও তৃতীয় পক্ষের সহায়তা দ্বারা প্ররোচিত / চাপিয়ে দেওয়া হয়েছে। 'ইভাল' এছাড়াও বিভিন্ন কারণে কেউ অন্য মোড়কের চেষ্টা করে যাতে সময় বিলম্বিত করে তাই বিভিন্ন কারণে অবহিত হয়। বোধগম্য হওয়ার বিকল্প রয়েছে যা 'থ্রো' হতে পারে। আমি মনে করি 'নতুন ফাংশন (পারমস, বডি)' সম্ভবত আপনাকে একটি ত্রুটি ছুঁড়ে ফেলবে, তবে আমি অনুমান করি যে আমার জন্য পরবর্তী প্রশ্নটি গতির তুলনা, অন্যথায় কেবল সেরা কোডের আকার হ্রাস (আমার কাছে দ্রুত বোঝায়)। [হুঁ এটা নতুন দেখাচ্ছে। আমি এটি চেষ্টা করিনি jsben.ch]
মাস্টার জেমস

পরিবর্তে নতুন ফাংশন কল করার বিষয়ে মিমি রাই আকর্ষণীয় পয়েন্ট। আমার উত্তরে আপনার পরিবর্তনগুলি জমা দিতে নির্দ্বিধায় অনেক ধন্যবাদ
ম্যাটিউস বারবোসা

ইয়া আমি এমনকি 'সোর্স মাইক্রিপ্ট.শ' ব্যবহার করে বাশ বলতে চাইছি আপনাকে এলিয়াস ইত্যাদির মাধ্যমে 'রফতানি' করতে দেবে classes নিশ্চিতভাবে অনুমোদিত না হলে আপনার একটি জেএস ইন্টারপ্রেটার চেক কোড থাকা উচিত। আমি একটি একক ফাংশনে একটি তৈরি করেছি, যা কোডের সহজতম অ্যাক্সিয়োমেটিক প্রকৃতি বোঝার জন্য আরও মজাদার একটি চ্যালেঞ্জ এবং এমনকি রান-টাইমও কারওর সাধ্যের বাইরে নয়।
মাস্টার জেমস

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;
}

সচেতন থাকুন যে আমি এটি আমার সেলফোনটি দিয়ে লিখেছি তাতে কিছু বড় হাতের সমস্যা এবং / অথবা অন্যান্য সংশোধন যেমন উদাহরণস্বরূপ ফাংশনগুলির নাম থাকতে পারে

আপনি যদি পিএইচপি-র মতো কোনও ফাংশন চান যা ভেরটি সেট করা আছে কিনা তা পরীক্ষা করে দেখুন:

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

0

পূর্ববর্তী উত্তরগুলি চিত্রিত করতে এখানে একটি দ্রুত জেএসফিডাল স্নিপেট:

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
*/


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.