الكائن Function في JavaScript

من موسوعة حسوب

الدالة البانية Function تُنشِئ كائن Function جديد، واستدعاء الدالة البانية مباشرةً يمكِّننا من إنشاء الدوال ديناميكيًا، لكنه يعاني من مشاكل تتعلق بالأداة والناحية الأمنية بما يشابه دالة eval.

يجدر بالذكر أنَّ جميع الدوال في JavaScript هي كائنات Function.

البنية العامة

new Function ([arg1[, arg2[, ...argN]],] functionBody)

arg1, arg2, ... argN

الأسماء المستخدمة من الدالة للإشارة إلى الوسائط المُمرَّرة إلى الدالة، ويجب أن تكون سلاسل نصية تُمثِّل مُعرِّفات JavaScript صالحة أو قائمة من تلك السلاسل النصية التي يُفصَل بينها بفاصلة؛ مثلًا: "x" أو "theValue" أو "a,b".

functionBody

سلسلة نصية تحتوي على تعابير JavaScript التي تُشكِّل جسم الدالة.

الوصف

كائنات Function التي تُنشَأ عبر الدالة البانية Function ستُفسَّر عند إنشاء الدالة. وهي أقل كفاءةً من تعابير التصريح عن الدوال أو تعابير تعريف الدوال.

جميع الوسائط المُمرَّرة إلى الدالة ستُعامل كأسماء لمُعرِّفات المعاملات التي أُنشِئَت في الدالة، وبالترتيب الذي مُرِّرَت فيه.

استدعاء الدالة البانية Function كدالة عادية (أي دون استخدام المعامل new) لها نفس أثر استدعائها كدالة بانية.

الخاصيات والدوال التابعة للدالة البانية Function

الكائن العام Function لا يملك خاصيات أو دوال تابعة له، لكن لمّا كان دالةً، فسيرث بعض الدوال والخاصيات عبر سلسلة prototype من Function.prototype.

الكائن prototype

الخاصيات

Function.arguments

مصفوفة تحتوي على الوسائط المُمرَّرة إلى الدالة، وهذه الخاصية أصبحت مهملة (deprecated)، ويُفضَّل استخدام الكائن arguments المتاح ضمن الدوال بدلًا منها.

Function.arity

تحديد عدد الوسائط التي تتوقعها الدالة. هذه الدالة محذوفة وغير مدعومة في جميع المتصفحات، ويجب استخدام الخاصية length بدلًا منها.

Function.caller

تحديد اسم الدالة التي استدعت الدالة التي تُنفَّذ حاليًا.

Function.length

تحديد عدد الوسائط الذي تتوقعه الدالة.

Function.name

إعادة اسم الدالة.

Function.displayName

إعادة اسم العرض (display name) للدالة. هذه الخاصية غير معيارية، وغير مدعومة في جميع المتصفحات.

Function.prototype.constructor

تُحديد الدالة التي ستُنشِئ كائن prototype للدالة؛ راجع صفحة الخاصية Object.prototype.constructor لمزيدٍ من التفاصيل.

الدوال

Function.prototype.apply()‎

استدعاء دالة وضبط قيمة المعامل this فيها إلى القيمة المعطية، وستُمرَّر الوسائط إليها كمصفوفة Array.

Function.prototype.bind()‎

إنشاء دالة جديدة التي ستُضبَط قيمة المعامل this عند استدعائها إلى القيمة المُحدَّدة، إضافةً إلى سلسلة الوسائط المُحدَّدة.

Function.prototype.call()‎

استدعاء دالة وضبط قيمة المعامل this فيها إلى القيمة المعطية، وستُمرَّر الوسائط إليها كما هي.

Function.prototype.isGenerator()‎

إعادة القيمة true إذا كان الدالة دالةً مولِّدةً (generator)؛ وإلا فستعيد القيمة false. هذه الدالة غير معيارية وغير مدعومة في جميع المتصفحات.

Function.prototype.toSource()‎

إعادة سلسلة نصية تحتوي على الشيفرة المصدرية التي تُمثِّل هذه الدالة. هذه الخاصية محذوفة وغير مدعومة في أغلبية المتصفحات.

Function.prototype.toString()‎

إعادة سلسلة نصية تُمثِّل الدالة، وهي إعادة تعريف للدالة Object.prototype.toString.

النسخ المُنشَأة من Function

النسخ المُنشَأة من الدالة البانية Function ترث الدوال والخاصيات من كائن Function.prototype؛ وكما في جميع الدوال البانية، يمكنك إجراء تغييرات إلى كائن prototype في الدالة البانية لكي تنعكس تلك التعديلات إلى جميع نسخ الكائن Function.

أمثلة

تعريف معاملات مع الدالة البانية Function

الشيفرة الآتية تُنشِئ دالةً باستخدام الدالة البانية Function تقبل وسيطين:

var adder = new Function('a', 'b', 'return a + b');

adder(2, 6); // 8

ستُستخدَم قيمة الوسيطين a و b في جسم الدالة في التعبير return a + b.

الفرق بين الدوال المنشَأة عبر الدالة البانية وتعابير التصريح عن الدوال

الدوال المُنشَأة عبر الدالة البانية Function لا تُنشئ تعابير مغلقة (closures) في سياق إنشائها، فهي تُنشَأ دومًا في المجال العام (global scope)، فعندي تشغيلها ستتمكن من الوصول إلى قيم المتغيرات المحلية الخاصة بها والمتغيرات العامة، وليس المتغيرات الموجودة في سياق استدعاء الدالة المُنشَأة من الدالة البانية Function. وهذا يختلف عن استخدام الدالة eval مع شيفرة تحتوي على تعبيرٍ لتعريف دالة.

var x = 10;

function createFunction1() {
    var x = 20;
    return new Function('return x;'); // المتغير العام
}

function createFunction2() {
    var x = 20;
    function f() {
        return x; // المتغير المحلي
    }
    return f;
}

var f1 = createFunction1();
console.log(f1());          // 10
var f2 = createFunction2();
console.log(f2());          // 20

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم نعم نعم نعم

انظر إلى صفحة كل دالة من الدوال التابعة للكائن Function لتفاصيل عن دعم المتصفحات لها.

مصادر ومواصفات