Function.caller

من موسوعة حسوب

الخاصية 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.