الدوال النقية والآثار الجانبية
اكتبوا دوال يمكن توقّعها واختبارها.
الدوال النقية والآثار الجانبية درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
ما الذي يجعل الدالة نقية
تتصف الدالة النقية بخاصيتين: فهي تُرجع الناتج نفسه دائمًا عند إعطائها المدخلات نفسها، ولا تُحدث أي آثار جانبية يمكن ملاحظتها. وتكون الدوال النقية قابلة للتنبؤ وسهلة الاختبار.
function add(a, b) {
return a + b;
}
console.log(add(2, 3));
console.log(add(2, 3)); // always 5الناتج الحتمي
تعني النقاء الحتمية. يجب أن تؤدي الوسيطات نفسها دائمًا إلى النتيجة نفسها، من دون الاعتماد على حالة مخفية أو الوقت أو العشوائية.
function double(n) {
return n * 2;
}
console.log(double(10)); // always 20ما الأثر الجانبي
الأثر الجانبي هو أي شيء تفعله الدالة خارج إرجاع قيمة، مثل التسجيل، أو تغيير حالة خارجية، أو الكتابة إلى التخزين، أو إجراء مكالمات شبكية، أو تغيير وسيطاتها.
let total = 0;
function impureAdd(n) {
total += n; // side effect: mutates outer state
return total;
}
console.log(impureAdd(5));
console.log(impureAdd(5)); // 5 then 10, not pureالاعتماد على حالة خارجية
تؤدي قراءة حالة خارجية قابلة للتغيير أيضًا إلى كسر النقاء، لأن الناتج يتغير مع بقاء الوسيط نفسه.
let rate = 1.5;
function priceImpure(x) {
return x * rate; // depends on outside variable
}
console.log(priceImpure(10)); // 15
rate = 2;
console.log(priceImpure(10)); // 20 - different resultجعل الدالة نقية
مرّر كل ما تحتاج إليه الدالة بوصفه وسيطات. عندها يعتمد ناتجها على المدخلات فقط.
function price(x, rate) {
return x * rate;
}
console.log(price(10, 1.5)); // 15
console.log(price(10, 2)); // 20تغيير الوسيطات يُفقد الدالة نقاءها
يُعد تغيير كائن أو مصفوفة مُمرَّرة إلى الدالة أثرًا جانبيًا يمكن للمستدعي ملاحظته. تترك الدوال النقية مدخلاتها دون تغيير.
function impurePush(arr, x) {
arr.push(x); // mutates caller array
return arr;
}
const a = [1, 2];
impurePush(a, 3);
console.log(a); // [1, 2, 3] - caller changedإرجاع قيم جديدة
تنشئ النسخة النقية قيمة جديدة وتُرجعها بدلًا من تغيير المدخل.
function pureAppend(arr, x) {
return [...arr, x];
}
const a = [1, 2];
const b = pureAppend(a, 3);
console.log(a); // [1, 2] unchanged
console.log(b); // [1, 2, 3]لماذا يفيد النقاء
الدوال النقية سهلة الاختبار للغاية، إذ لا تحتاج إلى إعداد أو محاكاة، وآمنة للتخزين المؤقت للنتائج (memoization)، وآمنة للتنفيذ بأي ترتيب أو بالتوازي. وهي تجعل الاستدلال حول الشيفرة محليًا.
function square(n) { return n * n; }
console.log([1, 2, 3].map(square)); // [1, 4, 9]عزل الآثار الجانبية
لا يمكنك تجنب جميع الآثار الجانبية؛ فالتطبيقات تحتاج إلى التسجيل وجلب البيانات والعرض. والهدف هو دفع الآثار إلى الأطراف والحفاظ على نقاء المنطق الأساسي.
function computeTotal(items) {
return items.reduce((s, i) => s + i.price, 0);
}
const total = computeTotal([{ price: 5 }, { price: 7 }]);
console.log(total); // 12 - pure core, log at the edgeالشفافية المرجعية
يمكن استبدال استدعاء نقي بناتجه من دون تغيير السلوك. فـ add(2, 3) قابل للاستبدال بـ 5 في أي موضع. وتُسمى هذه الخاصية الشفافية المرجعية.
function add(a, b) { return a + b; }
const x = add(2, 3) + add(2, 3);
const y = 5 + 5;
console.log(x === y); // trueاكتشاف عدم النقاء
انتبه إلى المؤشرات التالية: console أو Math.random أو Date.now أو إسناد قيم إلى متغيرات خارجية أو تغيير الوسيطات. يجعل أيٌّ من هذه الأمور الدالة غير نقية.
function pureRoll(seed) {
return (seed * 1103515245 + 12345) % 100;
}
console.log(pureRoll(42)); // deterministic, testableتحقق سريع
التعرّف على الدوال النقية.
مراجعة
الدوال النقية حتمية وخالية من الآثار الجانبية: فلا تغيّر حالة خارجية، ولا تنفذ عمليات إدخال وإخراج، ولا تغيّر الوسيطات. مرّر الاعتماديات بوصفها وسيطات وأرجع قيمًا جديدة بدلًا من التغيير. ويوفّر النقاء قابلية الاختبار والتخزين المؤقت للنتائج والشفافية المرجعية والأمان عند التنفيذ بالتوازي. حافظ على نقاء المنطق الأساسي وادفع الآثار إلى الأطراف.
الأسئلة الشائعة
هل درس «الدوال النقية والآثار الجانبية» مجاني؟
نعم — نص درس «الدوال النقية والآثار الجانبية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «الدوال النقية والآثار الجانبية»؟
اكتبوا دوال يمكن توقّعها واختبارها. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟
لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الدوال النقية والآثار الجانبية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟
نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الدوال النقية والآثار الجانبية
- تحويل البيانات بطريقة تصريحية
- تجنّب التعديل المباشر
- النمط الخالي من الوسائط