كيفية معرفة ما إذا تم تعريف وظيفة JavaScript
-
01-07-2019 - |
سؤال
كيف يمكنك معرفة ما إذا تم تعريف وظيفة في 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();
}