مفهوم Function ECMAScript (مفهوم)

الوظائف في ECMAScript هي في الواقع كائنات كاملة 功能ية.

كائن وظيفة (فئة)

من المحتمل أن يكون أكثر ما يثير الاهتمام في ECMAScript هو أن الوظائف هي في الواقع كائنات كاملة 功能ية.

فئة Function يمكنها تمثيل أي وظيفة تعريفها المطور.

النحو المستخدم لإنشاء وظائف باستخدام فئة Function كالتالي:

var function_name = new function(arg1, arg2, ... , argN, function_body)

في هذا الشكل،كل arg كلها تحتوي على معامل واحد،والمعامل الأخير هو جسم الوظيفة (النصوص التي يتم تنفيذها).يجب أن تكون هذه المعامل نصوصًا.

هل تتذكر هذه الوظيفة؟

function sayHi(sName, sMessage) {
  alert("Hello " + sName + sMessage);
}

يمكن تعريفها أيضًا بهذه الطريقة:

var sayHi 
= 
new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");

بالرغم من أن هذا الشكل صعب بعض الشيء بسبب العلاقة بين الأنماط،لكن يساعد في فهم أن الوظائف هي نوع من المراجع،وتبدو سلوكها بنفس الطريقة التي يتم إنشاؤها بواسطة Function class.

من فضلك انتبه لهذا المثال:

function doAdd(iNum) {
  alert(iNum + 20);
}
function doAdd(iNum) {
  alert(iNum + 10);
}
doAdd(10);	//يظهر "20"

كما تعلم،تم تحميل الدالة الثانية على الدالة الأولى، بحيث أن doAdd(10) أظهر "20" بدلاً من "30".

إذا تم إعادة كتابة هذا الكود بلغة أخرى،فهذا المفهوم سيكون واضحًا:

var doAdd = new Function("iNum", "alert(iNum + 20)");
var doAdd = new Function("iNum", "alert(iNum + 10)");
doAdd(10);

من فضلك انتبه لهذا الكود،من الواضح أن قيمة doAdd قد تغيرت لتشير إلى دالة مختلفة.اسم الدالة هو مجرد مرجع إلى دالة الكائن،وتبدو سلوكها مثل أي كائن آخر.حتى أنه يمكن أن يكون لديك متغيران يشيران إلى نفس الدالة:

var doAdd = new Function("iNum", "alert(iNum + 10)");
var alsodoAdd = doAdd;
doAdd(10);	//يظهر "20"
alsodoAdd(10);	//يظهر "20"

في هذا السياق،تم تعريف المتغير doAdd كوظيفة،ثم تم إعلان alsodoAdd كدالة تشير إلى نفس الوظيفة.يمكن استخدام هاتين الدوال تنفيذ كود الوظيفة وإنتاج نفس النتيجة - "20".لذلك،هل يمكن نقل الوظيفة كمعامل إلى وظيفة أخرى؟الإجابة هي نعم!

function callAnotherFunc(fnFunction, vArgument) {
  fnFunction(vArgument);
}
var doAdd = new Function("iNum", "alert(iNum + 10)");
callAnotherFunc(doAdd, 10);	//يظهر "20"

في هذا المثال، يحتوي callAnotherFunc() على معاملين - الوظيفة التي يتم طلب التشغيل عليها والمعاملات التي يتم نقلها إلى هذه الوظيفة. يقوم هذا الكود بتحويل doAdd() إلى وظيفة يتم تمريرها إلى callAnotherFunc()، معامل هو 10، ويظهر "20".

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

معامل length لمفهوم Function

كما ذكرنا سابقًا، تنتمي الوظائف إلى أنواع الإشارات، لذا لها أيضًا خصائص والطرق.

يحدد ECMAScript المعامل length لتوضيح عدد المعلمات المتوقعة للوظيفة. على سبيل المثال:

function doAdd(iNum) {
  alert(iNum + 10);
}
function sayHi() {
  alert("Hi");
}
alert(doAdd.length);	//يظهر "1"
alert(sayHi.length);	//يظهر "0"

تحدد وظيفة doAdd() معاملًا واحدًا، لذا فإن length هي 1؛ sayHi() لم تعرف معاملًا، لذا length هي 0.

تذكر، بغض النظر عن عدد المعلمات المحددة، يمكن للغة ECMAScript قبول عدد غير محدود من المعلمات (حتى 25 معاملًا)، وهو ما تم مناقشته في فصل "مقدمة إلى الوظائف". يوفر المعامل length طريقة مريحة لمعرفة عدد المعلمات المتوقعة بشكل افتراضي.

طرق مفهوم Function

للمفهوم Function، هناك أيضًا طرق مشتركة مع جميع الأجسام مثل valueOf() وtoString()، وتقوم هاتان الطريقتان بتقديم كود الوظيفة، وهو أمر مفيد جدًا أثناء التتبع. على سبيل المثال:

function doAdd(iNum) {
  alert(iNum + 10);
}
document.write(doAdd.toString());

يقوم هذا الكود بتحويل نص وظيفة doAdd() إلى نص.جرب بنفسك!