الكائن 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
لتفاصيل عن دعم المتصفحات لها.
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.
- معيار ECMAScript 1st Edition .