سؤال

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

فيما يلي بعض الطرق التي استخدمتها في الماضي:

/* 1: */  typeof myFunc === 'function'
/* 2: */  myFunc.constructor === Function
/* 3: */  myFunc instanceof Function

كجزء من بحثي ، ألقيت نظرة على كيفية إنجاز بعض المكتبات المعروفة هذا:

 /* jQuery 1.2.6: */  !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /^[\s[]?function/.test( fn + "" )
 /* jQuery 1.3b1: */  toString.call(obj) === "[object Function]"
/* Prototype 1.6: */  typeof object == "function"
      /* YUI 2.6: */  typeof o === 'function'

أنا مندهش من أن هناك العديد من الطرق المختلفة التي تستخدمها الكائنات ، وبالتأكيد تم الاتفاق على اختبار مقبول واحد؟ وأنا جاهل تمامًا بما كانت عليه النوايا مع تسليم JQuery 1.2.6 ، يبدو بعض الشيء ...

لذا ، يبقى quesiton الخاص بي ، ما هي أفضل طريقة للاختبار لوظيفة ما؟

وسأقدر أيضًا بعض البصيرة حول بعض الطرق المذكورة أعلاه ، وخاصة JQuery 1.2.6. (أستطيع أن أرى ما يفعلونه ، يبدو الأمر غريبًا)

*] من خلال "الأفضل" ، أعني الطريقة المتوافقة مع المتصفح المتقاطع على نطاق واسع.


تحرير: نعم ، أعلم أنه تمت مناقشته من قبل ، لكنني ما زلت أحب بعض النقاش حول الطريقة الأكثر فعالية. لماذا يوجد العديد من الطرق المختلفة المستخدمة؟

لقد ذكرت المناقشات المتعلقة بذلك حتى الآن فقط مشغل typeof (في الغالب) ولكن لم يلمح أحد إلى فعالية الأساليب البديلة.

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

المحلول

أفضل طريقة لاختبار ما إذا كان الكائن هو وظيفة typeof myFunc === 'function'. إذا كنت تستخدم مكتبة ، فاستخدم اختبار وظيفة المكتبة: jQuery.isFunction(myFunc).

أشياء يستطيع يتم الإبلاغ عنها كوظائف عند استخدامها typeof. هذا أمر نادر جدًا ولكن هناك مكتبة لإزالة هذه التناقضات. jQuery العمل حول هذه القضايا:

  • تعمل تقارير Firefox مع typeof document.createElement("object")
  • تعمل تقارير Safari مع typeof document.body.childNodes
  • أبلغت الإصدارات القديمة من Firefox عن تعبيرات منتظمة كوظائف (هذا ليس هو الحال في 3.0).
  • بعض IE بنيت في وظائف عالمية (alert) وبعض طرق العقدة (getAttributeويبلغ التقارير ليكون من النوع "كائن".

استخدام instanceof عوضا عن typeof تحيط ببعض هذه. فمثلا، document.createElement("object") instanceof Function هو false في Firefox.

يمكنك عرض ولادة الطريقة الأولى في التعليقات التذكرة الأصلية (#3618). الطريقة الجديدة من تغييرات 5947 ويبدو أنه تم اختراعه من قبل Resig لحل أي تسرب الذاكرة. ربما يكون أبطأ ، ولكن أصغر ، ونظافة.

لا يوجد فرق كبير بين == و === هنا من حيث كيفية عمل الأشياء ولكن التقييم الصارم أسرع قليلاً وبالتالي مفضل.

نصائح أخرى

يبدو أن John Resig لمطور JQuery قد اتخذ بعض الخيارات الغريبة في الداخلية من jQuery.

toString.call(obj) === "[object Function]"

يبدو أنيقًا جدًا ولكن لا يمكنني التفكير في أي موقف يكون فيه ما سبق صحيحًا حيث يكون الأمر بسيطًا typeof سوف يفشل النهج ، لكنه ربما يعرف شيئًا لا يفعله بقية الاستخدام.

typeof o === "function"

كنت سأذهب مع الأخير لأنه يتمتع وضوح أكبر ، إلا إذا كان لديك دليل قوي على أنه لن ينجح.

لماذا تستخدم المساواة الصارمة على typeof بما أن كلا المعاملين سلاسل؟ أنا أطل على بعض القضايا؟

على أي حال ، أود أن أذهب إلى طريقة أبسط من النوع ، والتي تبدو وكأنها تتم لذلك ويمكن قراءتها. instanceof يمكن قراءته أيضًا ، لكن يبدو أنه يصر أكثر على حقيقة أن الوظيفة هي كائن ، والذي قد يكون غير ذي صلة بالمشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top