একটি জাভাস্ক্রিপ্ট ফাংশন সংজ্ঞায়িত করা হয়েছে কীভাবে বলতে হয়


302

জাভাস্ক্রিপ্টে কোনও ফাংশন সংজ্ঞায়িত করা থাকলে আপনি কীভাবে বলবেন?

আমি এরকম কিছু করতে চাই

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

তবে এটি আমাকে পেয়ে যায়

কলব্যাক কোনও ফাংশন নয়

কলব্যাক সংজ্ঞায়িত না হলে ত্রুটি।

উত্তর:


475
typeof callback === "function"

47
এটি সত্যই কোনও ম্যাজিক স্ট্রিং নয়, যেহেতু টাইপফের মানগুলির সেটটি ইসিএমএ স্পেসে সুনির্দিষ্টভাবে সংজ্ঞায়িত করা হয়েছে। যদিও এর জন্য সিনট্যাক্সটি শুরু করার জন্য কিছুটা বোকা, এটি পুরোপুরি যুক্তিসঙ্গত জাভাস্ক্রিপ্ট।
বেন জোটো

2
@ কুইকসোটো - বুঝেছি, আমি অনুমান করি আমার অর্থ হ'ল আপনার এখনও স্ট্রিং নির্বিশেষে থাকা দরকার - আমার কোডটি লিখিতভাবে একেবারে প্রয়োজনের তুলনায় আর লিখিত না; অতএব, যদি কোনও কাজ হয় তবে পরীক্ষার জন্য এটি আমার আদর্শ নয়।
জেসন বুটিং 21

4
এবং হ্যাঁ, "যাদু" হচ্ছিল একটি নিচু, দুর্বল শব্দের পছন্দ - আমার অর্থ "আক্ষরিক স্ট্রিং" নয় "ম্যাজিক স্ট্রিং"। আমার খারাপ। :)
জেসন বুটিং


আপনার ফাংশনটিতে প্রথম বন্ধনী সরিয়ে ফেলার বিষয়টি নিশ্চিত করুন এবং কেবলমাত্র-শর্তে ফাংশনটির নামটি ব্যবহার করুন বা ফাংশনটি আপনাকে সত্য বা মিথ্যা দেওয়ার পরিবর্তে ডাকা হবে।
রাসেল স্ট্রস

236

বর্তমানের সমস্ত উত্তর একটি আক্ষরিক স্ট্রিং ব্যবহার করে, যা আমি যদি সম্ভব হয় আমার কোডে না রাখাই পছন্দ করি - এটি (এবং বুট করার জন্য মূল্যবান অর্থপূর্ণ অর্থ প্রদান করে):

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

ব্যক্তিগতভাবে, আমি আমার কোডটিতে ঝুলন্ত স্ট্রিংগুলির সংখ্যা হ্রাস করার চেষ্টা করি ...


এছাড়াও, আমি যখন সচেতন যে typeofএটি একটি অপারেটর এবং কোনও ফাংশন নয়, সিনট্যাক্স ব্যবহারে সামান্য ক্ষতি হ'ল যা এটি পরবর্তী হিসাবে উপস্থিত হয়।


7
আমার এই ফাংশনটি কীভাবে ব্যবহার করার কথা? আমি চেষ্টা করেছি isFunction(not_defined))যেখানে not_definedফাংশনটির নাম যেখানে সংজ্ঞায়িত করা হয়নি এবং ফায়ারব্যাগ ফিরে এসেছে not_defined is not definedযা সঠিক তবে আপনার ফাংশনটি মিথ্যা ফিরে পাওয়া উচিত এবং ত্রুটি উত্পন্ন করা উচিত নয় ...
Wookie88 অক্টোব

@ উইকিউই ৮৮: প্রযুক্তিগতভাবে বলতে গেলে, আমার উত্তরে চিত্রিত ফাংশনটি ত্রুটি হিসাবে এতটা ত্রুটি ঘটায় না কারণ জাভাস্ক্রিপ্ট ইন্টারপ্রেটার প্রতীকটি সমাধান করতে চেষ্টা করছে not_definedযাতে তার মানটি পাস করে isFunction()এটি সমাধান করতে ব্যর্থ হয়। isFunction()এই সমস্যাটি সমাধানের সংজ্ঞা অনুসারে কিছুই করা যায় না ।
জেসন বুটিং

3
@ জাচারি ইয়েটস রেফারেন্সইরারের চারপাশে কাজ করার অর্থ সম্ভবত-সংজ্ঞায়িত-ফাংশনটির কোনও রেফারেন্স সহ কাজ করা এড়ানো হবে। আপনি ফাংশন কলের ভিতরে টাইপচেকটি করতে পারেন এবং ফলটি ফাংশনে পাস করতে পারেন। jsfiddle.net/qNaxJ হয়তো এত সুন্দর না হলেও কমপক্ষে কোনও স্ট্রিং ব্যবহার করা হয়নি;)
netiul

8
অথবা কোনও ফাংশন এড়িয়ে চলুন isFunctionএবং ঠিক করুন (typeof no_function == typeof Function)
netiul

2
@ জেসনবুন্টিং আপনি যদি সেই বাছাই করতে যাচ্ছেন তবে আপনার সত্যই ব্যবহার করা উচিত typeof(Function())কারণ ফাংশন একটি ফাংশন; তবে অ্যারে, অবজেক্ট এবং অন্যান্য অন্তর্নির্মিত প্রোটোটাইপগুলি (আরও ভাল শর্তের অভাবে) are যদি আপনি কোনও অ্যারে পরীক্ষা করে থাকেন তবে typeof(array) === typeof(Array)উদাহরণস্বরূপ আপনি ব্যবহার করবেন না ; আপনি typeof(array) === typeof(Array())সতর্কতা ও ধারাবাহিকতা বজায় রাখলে আপনাকে অবশ্যই ফাংশনটি মূল্যায়ন করতে হবে কারণ আপনি ব্যবহার করবেন ।
সানহ্যামসন

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

মনে রাখবেন যে, কলব্যাক (নিজে) মূল্যায়ণ করতে falseএটা হলে undefined, null, 0, অথবা false। তুলনা nullঅত্যধিক নির্দিষ্ট।


2
এছাড়াও মনে রাখবেন যে যদি callbackনিজে কোনও "মিথ্যা-ওয়াই" মানকে মূল্যায়ন করে তবে এর টাইপটি কখনও "ফাংশন" হতে পারে না
জো

5
@ জো, তবে সংক্ষিপ্ত-প্রচারের কারণে কলব্যাক মিথ্যা হিসাবে মূল্যায়ন করলে সেই পরীক্ষা করা হবে না।
ফ্যাবিও এ।

3
এই সমাধানটি কাজ করছে না, কারণ প্রথম শর্তটি তাত্ক্ষণিকভাবে একটি ব্যতিক্রমকে সরিয়ে দেবে। এটি কোনও বস্তুর সম্পত্তির জন্য কাজ করতে পারে: যদি (obj.callback) {...}
রোয়

8

কোনও ফাংশন বাস্তবায়িত হয়েছে কিনা তা জানাতে সেই পদ্ধতিগুলি যদি ভেরিয়েবল সংজ্ঞায়িত না হয় তবে ব্যর্থ হয় তাই আমরা আরও শক্তিশালী এমন কিছু ব্যবহার করছি যা একটি স্ট্রিং প্রাপ্তিকে সমর্থন করে:

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

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

আমি মনে করি একটি ভাল উত্তর, আপনি ঠিক বলেছেন, উপরের সমস্ত পদ্ধতি ব্যর্থ হ'ল ফাংশনটি সংজ্ঞায়িত হয়নি।
মাত্তেও কন্টা

অপরিবর্তিত রেফারেন্সগুলি এড়াতে এটি তুচ্ছ - কেবল typeof window.doesthisexistপরিবর্তে উল্লেখ করুন doesthisexist। তবে প্রদর্শিত হিসাবে ইওল (যা: মন্দ) ব্যবহার করা কেবলমাত্র নামযুক্ত ফাংশনগুলির সাথে কাজ করবে - এটি প্রশ্নের ক্ষেত্রে ব্যবহারের ক্ষেত্রে কাজ করবে না।
AD7six

সচেতন থাকুন যে এটি কেবল বিশ্বব্যাপী সুযোগ নিয়ে কাজ করে, যখন গৃহীত উত্তরগুলি স্থানীয় স্কোপ ফাংশনগুলির সাথেও কাজ করে।
inf3rno

6

জাভাস্ক্রিপ্টে নতুন আমি আচরণের পরিবর্তন হয়েছে কিনা তা নিশ্চিত নই তবে জেসন বুটিং (years বছর আগে) প্রদত্ত সমাধানটি সম্ভব ফাংশনটি সংজ্ঞায়িত না হলে কাজ করবে না।

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

ReferenceError: possibleFunction is not definedইঞ্জিন সম্ভাব্য প্রতীকটি সমাধান করার চেষ্টা করার সাথে সাথে এটি একটি ত্রুটি ছুঁড়ে ফেলবে (জেসনের উত্তরের মন্তব্যে উল্লিখিত)

এই আচরণটি এড়াতে আপনি কেবলমাত্র ফাংশনটির নামটি পাস করতে পারেন আপনি এটির উপস্থিতি আছে কিনা তা যাচাই করতে চান। সুতরাং

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

এটি কোনও ভেরিয়েবলকে আপনি যে ফাংশনটি যাচাই করতে চান তা হতে হবে বা খালি অবজেক্টটি যদি এটি সংজ্ঞায়িত না করা হয় এবং তাই উপরে বর্ণিত সমস্যাগুলি এড়িয়ে চলে sets


সম্পূর্ণ পরিষ্কার হতে: আমার কোড ত্রুটি ছুঁড়ে না, এটি কেবল জাভাস্ক্রিপ্ট পার্সার করছে that আপনি যদি কোনও অপরিবর্তিত শনাক্তকারীকে এভাবে ব্যবহার করার চেষ্টা করেন তবে একই ঘটনা ঘটবে।
জেসন বুটিং

6

চেষ্টা করুন:

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

এইচআই, ভেরিয়েবলের প্রকারের তুলনা করতে সর্বদা '='= তুলনা (==) ব্যবহার না করে' === 'ব্যবহার করুন।
জোয়েল কারনেইরো

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

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

3
একটি বিট গোঁড়া, এবং এখনও একটি স্ট্রিং আক্ষরিক ব্যবহার করে। কীভাবে if(typeof Function === typeof callback)...? :)
জেসন বুটিং

@ জেসনবন্টিং কৌতূহল, স্ট্রিং আক্ষরিক ব্যবহারে কী ভুল?
বিসিয়েন

@ বিসিয়েন - যেমনটি আমি বলেছিলাম, এটি আমার পেডেন্টিক, তবে জিনিসটি এখানে। আসুন আমরা typeofজাভাস্ক্রিপ্টের নতুন / ভিন্ন প্রয়োগের কারণে স্ট্রিং আক্ষরিক সহ কোডটি ব্যবহার করেছি এবং পরে কিছু আলাদা (সম্ভবত "ফাংশন" এর পরিবর্তে "ফাংশন") ফেরানোর জন্য কলটি ব্যবহার করেছে - মনে হচ্ছে এর কম সম্ভাবনা কম হবে বলে মনে হয় একটি নতুন / পৃথক বাস্তবায়ন typeof Function === typeof callbackচেকটি ভেঙে দেবে কারণ এটি শব্দার্থক স্তরে একই হওয়া উচিত।
জেসন বুটিং


4

আমি করতে পারে

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

আমি জানি একটি গ্রহণযোগ্য উত্তর আছে, কিন্তু কেউ এটি প্রস্তাব করেনি। আমি এই সত্যবাদী এর বিবরণ ফিট করে কিনা তা নিশ্চিত না, তবে এটি সব ক্ষেত্রেই কাজ করে।

আরও নতুন জাভাস্ক্রিপ্ট ইঞ্জিনগুলির finallyপরিবর্তে একটি ব্যবহার করা যেতে পারে।


এটি একটি ঝরঝরে শর্টকাট! যদিও এটি কোনও ফাংশন বিদ্যমান বা সংজ্ঞায়িত হয়ে থাকলে (এটি কার্যকর না করেও) একমাত্র পরীক্ষার জন্য কাজ করবে না।
বিজোর

সেটা সত্য. আমি এমন একটি পরিস্থিতি ধরে নিয়েছি যেখানে কলব্যাক সেই কার্যকরকরণের স্থানে optionচ্ছিক। আমি সাধারণত typeof callbackযেভাবেই ব্যবহার করি ।
কোয়ান্টিন এঙ্গেলস

এটা বোধগম্য; আমি এর বিষয়বস্তু চেয়ে প্রশ্ন শিরোনাম উপর ফোকাস ছিল। কখনও কখনও আমি কোনও কিছুর জন্য টন টেস্টের উপর ট্র্যাচ-ক্যাচ ব্যবহার করার সরলতা পছন্দ করি। আপনি কি মনে করেন যে এটি ব্যবহারের কোনও প্রযুক্তিগত অসুবিধা আছে, এক্ষেত্রে টাইপফের মতো কিছু বনাম? অথবা এটি মূলত আরও সঠিক / প্রত্যাশিত উপায়ে কাজ করার বিষয়?
বিজোর

1
আপনি যদি একাধিক ধরণের জন্য পরীক্ষা করতে চান তবে ব্যতিক্রমগুলি এতটা ভাল নয়। উদাহরণস্বরূপ, আমি এখন যে প্রকল্পটি নিয়ে কাজ করছি তাতে একটি ভেরিয়েবলের উপর ফাংশন, স্ট্রিং বা যা কিছু আছে তা দেখতে প্রচুর প্রকারের পরীক্ষা করা ব্যবহার করে। এই প্রকল্পে আমি সত্যিই ধরণের প্রয়োজন। এর জন্য আমি ধরণের অ্যারে ব্যবহার করি এবং accepted_types.indexOf(typeof value) !== -1এটি বিভিন্ন ধরণের রয়েছে কিনা তা পরীক্ষা করে দেখুন। এই পরিস্থিতিতে আমার মতে ব্যতিক্রমগুলি নিষিদ্ধ হবে।
কোয়ান্টিন এনগলস

2

এটা চেষ্টা কর:

callback instanceof Function

1
কাজ করে না। এটি আপনাকে ত্রুটিটি দেবে। উত্তর হিসাবে পোস্ট করার আগে আপনার এটি চেষ্টা করা উচিত।
vbullinger

@vbullinger আমি ক্রোম, ফায়ারফক্স এবং সাফারিতে আবার পরীক্ষা করেছি - সর্বত্র কাজ করে। কোন ইঞ্জিন নিয়ে আপনি সমস্যার সম্মুখীন হয়েছিলেন?
ইল্ফ

ফায়ারফক্স। কলব্যাক সংজ্ঞায়িত না হলে আপনি কেসটি পরীক্ষা করেছিলেন?
vbullinger

এর কারণ আপনি সরাসরি একটি
অপরিজ্ঞাত

3
এটি কোনও ফাংশন প্যারামিটারে ব্যবহার করার সময় কাজ করে, যা লেখক তার কাছে যা চেয়েছিলেন - আমি মনে করি ECMAScript একটি অস্তিত্বশীল ভেরিয়েবল এবং অপরিবর্তিত মান সহ একটি বিদ্যমান ভেরিয়েবলের ক্ষেত্রে পৃথক করে। এই সম্পর্কে আরও জানতে আকর্ষণীয় হবে।
ইওল্ফ

2

আপনি তাকান তাহলে উৎস গ্রন্থাগার @Venkat Sudheer রেড্ডি Aedama উল্লেখ করা হয়েছে, underscorejs এর, আপনি এই দেখতে পারেন:

_.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পাশাপাশি ব্যবহার করতে পারেন , কিন্তু আফাইক। এর মান Functionবিভিন্ন ফ্রেমে আলাদা হবে, সুতরাং এটি কেবলমাত্র একক ফ্রেমের অ্যাপ্লিকেশন সহ সঠিকভাবে কাজ করবে। এজন্য আমরা সাধারণত typeofপরিবর্তে ব্যবহার করি । মনে রাখবেন যে কিছু পরিবেশে typeof fখুব অসাধারণতাও থাকতে পারে যেমন, এমএসআইই 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 যে ফাংশনগুলি মিথ্যা / মিথ্যা মানগুলি ফিরিয়ে দেয় সেগুলি এখনও কল হয়। অবশ্যই, যখন আপনি মানগুলি ফেরত চান তার জন্য এটি কাজ করে না।
সমীর আলাজমোভিচ

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