سؤال

كيف يمكنك معرفة ما إذا تم تعريف وظيفة في JavaScript؟

أريد أن أفعل شيئا من هذا القبيل

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

لكنه يحصل لي

رد الاتصال ليس وظيفة

خطأ عندما لم يتم تعريف رد الاتصال.

هل كانت مفيدة؟

المحلول

typeof callback === "function"

نصائح أخرى

تستخدم جميع الإجابات الحالية سلسلة حرفية، والتي أفضل عدم وجودها في الكود الخاص بي إن أمكن - وهذا لا (ويوفر معنى دلاليًا قيمًا للتمهيد):

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

أنا شخصياً أحاول تقليل عدد السلاسل المعلقة في الكود الخاص بي ...


أيضا، مع أنني على علم بذلك typeof عامل وليس وظيفة، هناك ضرر قليل في استخدام بناء الجملة الذي يجعلها تظهر على أنها الأخيرة.

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

لاحظ أن رد الاتصال (بنفسه) يتم تقييمه إلى false اذا كانت undefined, null, 0, ، أو false.مقارنة مع null محدد بشكل مفرط.

هذه الطرق لمعرفة ما إذا تم تنفيذ الوظيفة تفشل أيضًا إذا لم يتم تعريف المتغير لذلك نحن نستخدم شيئًا أكثر قوة يدعم تلقي سلسلة:

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

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

جديد على JavaScript لست متأكدًا مما إذا كان السلوك قد تغير ولكن الحل الذي قدمه Jason Bunting (منذ 6 سنوات) لن يعمل إذا لم يتم تحديد الوظيفة.

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

هذا سوف يرمي ReferenceError: possibleFunction is not defined خطأ أثناء محاولة المحرك حل الرمزاحتمالالوظيفة (كما هو مذكور في التعليقات على إجابة جيسون)

لتجنب هذا السلوك، يمكنك فقط تمرير اسم الوظيفة التي تريد التحقق من وجودها.لذا

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

يؤدي هذا إلى تعيين المتغير ليكون إما الوظيفة التي تريد التحقق منها أو الكائن الفارغ إذا لم يتم تعريفه وبالتالي يتجنب المشكلات المذكورة أعلاه.

يحاول:

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

ربما أفعل

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

أعلم أن هناك إجابة مقبولة، لكن لم يقترح أحد ذلك.لست متأكدًا حقًا مما إذا كان هذا يناسب الوصف الاصطلاحي، ولكنه يعمل في جميع الحالات.

في محركات JavaScript الأحدث أ finally يمكن استخدامها بدلا من ذلك.

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

جرب هذا:

callback instanceof Function

إذا نظرت إلى مصدر من المكتبة @Venkat Sudheer Reddy Aedama المذكورة، الشرطة السفلية، يمكنك رؤية هذا:

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

هذه مجرد تلميحاتي، إجابتي التلميحية:>

يحاول:

if (!(typeof(callback)=='undefined')) {...}

إذا كنت تستخدم http://underscorejs.org, ، لديك:http://underscorejs.org/#isFunction

_.isFunction(callback);

كنت أبحث عن كيفية التحقق من تعريف وظيفة jQuery ولم أجدها بسهولة.

ربما قد أحتاجه ;)

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

إذا 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();
    }
}

القيد هو أنه سيتم دائمًا تنفيذ وسيطة رد الاتصال على الرغم من أنها غير محددة.

بالنسبة للوظائف العامة، يمكنك استخدام هذه الوظيفة بدلاً من 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, ، لكنهم يفعلون نفس الشيء تقريبًا.

معظم الإجابات السابقة، إن لم يكن كلها، لها آثار جانبية لاستدعاء الوظيفة

هنا أفضل الممارسات

لديك وظيفة

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

حل سطر واحد:

function something_cool(text, callback){
    callback && callback();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top