Skip to content

8. الوظائف

Image

8.1. نص برمجي [func-01]

يركز البرنامج النصي على طريقة تمرير معلمات الدالة:

  • التمرير بالقيمة للأرقام والسلاسل والقيم المنطقية؛
  • التمرير بالمرجع للمصفوفات والكائنات الحرفية والوظائف؛

'use strict';
// طريقة تمرير معلمات الدالة
// -----------------------عدد - التمرير بالقيمة
function doSomethingWithNumber(param) {
  param++;
  console.log("[param inside function]=", param, "[type]=", typeof (param), "[passage par référence]=", param === count);
}
// رمز الاستدعاء
let count = 10;
doSomethingWithNumber(count);
console.log("[count outside function]=", count);

// --------------------- سلسلة - التمرير بالقيمة
function doSomethingWithString(param) {
  param += " xyz"
  console.log("[param inside function]=", param, "[type]=", typeof (param), "[passage par référence]=", param === text);
}
// رمز الاستدعاء
let text = "abcd";
doSomethingWithString(text);
console.log("[text outside function]=", text);

// --------------------- منطقية - تمرير بالقيمة
function doSomethingWithBoolean(param) {
  param = !param;
  console.log("[param inside function]=", param, "[type]=", typeof (param), "[passage par référence]=", param === bool);
}
// رمز الاستدعاء
let bool = true;
doSomethingWithBoolean(bool);
console.log("bool [outside function]=", bool);

// --------------------- مصفوفة - تمرير بالمرجع
function doSomethingWithArray(param) {
  param.push(1000);
  console.log("[param inside function]=", param, "[type]=", typeof (param), "[passage par référence]=", param === tab);
}
// رمز الاستدعاء
const tab = [10, 20, 30];
doSomethingWithArray(tab);
console.log("[tab outside function]=", tab);

// --------------------- كائن - تمرير بالمرجع
function doSomethingWithObject(param) {
  param.unePropriétéNouvelle = "xyz";
  console.log("[param inside function]=", param, "[type]=", typeof (param), "[passage par référence]=", param === obj);
}
// رمز الاستدعاء
const obj = [10, 20, 30];
doSomethingWithObject(obj);
console.log("[obj outside function]=", obj);

// --------------------- دالة - تمرير بالمرجع
function doSomethingWithFunction(param) {
  // شيء غريب نوعًا ما لكنه يعمل
  param.unePropriétéNouvelle = "xyz";
  console.log("[param inside function]=", param, "[type]=", typeof (param), "[passage par référence]=", param === f);
}
// رمز الاستدعاء
const f = x => x + 4;
doSomethingWithFunction(f);
console.log("[f outside function]=", f, f.unePropriétéNouvelle, typeof (f));

التنفيذ


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\fonctions\func-01.js"
[param inside function]= 11 [type]= number [passage par référence]= false
[count outside function]= 10
[param inside function]= abcd xyz [type]= string [passage par référence]= false
[text outside function]= abcd
[param inside function]= false [type]= boolean [passage par référence]= false
bool [outside function]= true
[param inside function]= [ 10, 20, 30, 1000 ] [type]= object [passage par référence]= true
[tab outside function]= [ 10, 20, 30, 1000 ]
[param inside function]= [ 10, 20, 30, 'unePropriétéNouvelle': 'xyz' ] [type]= object [passage par référence]= true
[obj outside function]= [ 10, 20, 30, 'unePropriétéNouvelle': 'xyz' ]
[param inside function]= x => x + 4 [type]= function [passage par référence]= true
[f outside function]= x => x + 4 xyz function

8.2. نص برمجي [func-02]

يوضح البرنامج النصي التالي أن النوع [function] هو نوع بيانات مثل أي نوع آخر وأن المتغير يمكن أن يكون من هذا النوع. كما يوضح طريقتين لتعريف الدالة:

  • إحداها باستخدام الكلمة الرئيسية [function]؛
  • والأخرى باستخدام رمز "السهم" =>؛

'use strict';
// يمكن تعيين دالة إلى متغير
const variable1 = function (a, b) {
  return a + b;
};
console.log("typeof(variable1)=", typeof (variable1));
// يمكن بعد ذلك استخدام المتغير كدالة
console.log("variable1(10,12)=", variable1(10, 12));
// يمكن تعريف الدالة باستخدام الترميز =>
const variable2 = (a, b, c) => {
  return a - b + c;
};
console.log("variable2(10,12,14)=", variable2(10, 12, 14));
// يمكن عدم وضع الأقواس إذا كان هناك تعبير واحد فقط في كود الدالة
// يكون هذا التعبير عندئذٍ هو قيمة الإرجاع للدالة
const variable3 = (a, b, c) => a + b + c;
console.log("variable3(10,12,14)=", variable3(10, 12, 14));

التنفيذ


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\fonctions\func-02.js"
typeof(variable1)= function
variable1(10,12)= 22
variable2(10,12,14)= 12
variable3(10,12,14)= 36

8.3. نص برمجي [func-03]

يعود هذا البرنامج النصي إلى إمكانية تمرير دالة كمعلمة إلى دالة أخرى. تُستخدم هذه العملية بكثرة في أطر عمل جافا سكريبت.


'use strict';
// يمكن أن تكون معلمات الدالة من النوع [fonction]

// الدالة f1
function f1(param1, param2) {
  return param1 + param2 + 10;
}
// الدالة f2
function f2(param1, param2) {
  return param1 + param2 + 20;
}
// الدالة g مع الدالة f كمعلمة
function g(param1, param2, f) {
  return f(param1, param2) + 100;
}
// استخدامات g
console.log(g(0, 10, f1));
console.log(g(0, 10, f2));
// يمكن تمرير المعلمة الفعلية من نوع الدالة مباشرة - الشكل 1
console.log(g(0, 10, (param1, param2) => {
  return param1 + param2 + 30;
}));
// يمكن تمرير المعلمة الفعلية من نوع الدالة بشكل مباشر - الشكل 2
console.log(g(0, 10, function (param1, param2) {
  return param1 + param2 + 40;
}));

التنفيذ


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\fonctions\func-03.js"
120
130
140
150

8.4. البرنامج النصي [func-04]

يوضح البرنامج النصي التالي أن دالة جافا سكريبت يمكن أن تتصرف كفئة:


'use strict';
// يمكن استخدام الدالة ككائن

// قشرة فارغة
function f() {

}
// يتم تعيين خصائص لها من الخارج
f.prop1 = "val1";
f.show = function () {
  console.log(this.prop1);
}
// استخدام f
f.show();

// دالة g تعمل كفئة
function g() {
  this.prop2 = "val2";
  this.show = function () {
    console.log(this.prop2);
  }
}
// إنشاء مثيل للدالة باستخدام [new]
new g().show();

تعليقات

  • الأسطر 5-7: لا يحدد نص الدالة f أي خاصية؛
  • الأسطر 9-12: يتم إعطاء خصائص للدالة f من الخارج؛
  • السطر 14: استخدام الدالة (الكائن) f. لاحظ أننا لا نكتب [f()] بل نكتفي بكتابة [f]. هذه هي صيغة الكائن؛
  • الأسطر 17-22: يتم تعريف دالة [g] كما لو كانت فئة ذات خصائص وأساليب؛
  • السطر 24: يتم إنشاء مثيل للدالة [g] بواسطة [new g()]؛

نتائج التنفيذ


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\classes\class-00.js"
val1
val2

أدخلت ES6 مفهوم الفئة الذي يسمح لنا الآن بتجنب المرور عبر الدوال للحصول على فئات.

8.5. نص برمجي [func-05]

يُظهر البرنامج النصي [func-05] استخدام عامل يُسمى [rest operator]:


'use strict';
// عامل الباقي
function f(arg1, ...otherArgs) {
  // الحجة الأولى
  console.log("arg1=", arg1);
  // الحجج الأخرى
  let i = 0;
  otherArgs.forEach(element => {
    console.log("otherArguments[", i, "]=", element);
    i++;
  });
}

// استدعاء
f(1, "deux", "trois", { x: 2, y: 3 })
  • السطر 3: الترميز [...otherArgs] يعني أنه عند استدعاء من النوع f(param1, param2, param3) سنحصل على السطر 3:
    • arg1=param1
    • otherArgs=[param2, param3]. وبالتالي، فإن [otherArgs] هو مصفوفة تجمع جميع المعلمات الفعلية التي تم تمريرها بعد [param1

نتائج التطبيق هي كما يلي:

1
2
3
4
arg1= 1
otherArguments[ 0 ]= deux
otherArguments[ 1 ]= trois
otherArguments[ 2 ]= { x: 2, y: 3 }