Function.caller

من موسوعة حسوب
< JavaScript‏ | Function
مراجعة 15:37، 28 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

الخاصية Function.caller تُعيد الدالة التي استدعت الدالة التي تُنفَّذ حاليًا. لا يجوز استخدام هذه الخاصية في نمط strict.

الوصف

إذا لم تُستدعَ الدالة f ضمن دالة أخرى (أي أنها استدعيت في أعلى مستوى top level)، فقيمة الخاصية f.caller هي null.

هذه الخاصيةُ هي بديلٌ عن الخاصية المحذوفة arguments.caller التابعة للكائن arguments.

لاحظ أنَّه في حالة الاستدعاء التعاودي (recursion)، فلا يمكننا إعادة بناء مكدس الاستدعاءات (call stack) باستخدام هذه الخاصية. فلتكن لدينا الشيفرة:

function f(n) { g(n - 1); }
function g(n) { if (n > 0) { f(n); } else { stop(); } }
f(2);

وفي لحظة استدعاء الدالة stop()‎ سيكون مكدس الاستدعاءات بالشكل الآتي:

f(2) -> g(1) -> f(1) -> g(0) -> stop()

ويكون التعبير الآتي صحيحًا:

stop.caller === g && f.caller === g && g.caller === f

إذا حاولنا الحصول على مكدس الاستدعاءات في الدالة stop()‎ كما يلي:

var f = stop;
var stack = 'Stack trace:';
while (f) {
  stack += '\n' + f.name;
  f = f.caller;
}

فلن تنتهي حلقة التكرار أبدًا.

أمثلة

مثال بسيط يختبر الخاصية caller التابعة للدالة لمعرفة إن كانت مستدعاةً ضمن دالة أخرى أم لا:

function myFunc() {
  if (myFunc.caller == null) {
    return 'The function was called from the top!';
  } else {
    return 'This function\'s caller was ' + myFunc.caller;
  }
}

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

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

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

هذه الخاصية غير معيارية، وهي مُطبَّقة في إصدار JavaScript 1.5.