اللافتات label في JavaScript

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

التعبير البرمجي label يمكن أن يُستخدَم مع التعبير البرمجي break أو continue، وهو يوضع قبل التعابير البرمجية لإضافة لافتة (مُعرِّف) لها يمكن الإشارة إليها.

لاحظ أنَّ من غير الشائع استخدام حلقات تكرار مع لافتات (labels)، وتُستخدَم عادةً الدوال بدلًا القيام بقفزات بين حلقات التكرار.

البنية العامة

label :
   statement

label

لافتة للتعبير البرمجي، ويمكن أن تكون أيّ مُعرِّف في JavaScript صالح (وليس كلمةً محجوزةً).

statement

التعابير البرمجية التي ستُضاف اللافتة إليها، ويمكن استخدام التعبير البرمجي break مع أيّ تعبير برمجي له لافتة، أما التعبير continue فيمكن أن يُستخدَم مع أيّة حلقات تكرار لها لافتة.

الوصف

يمكنك استخدام لافتة (label) لإضافة مُعرِّف إلى حلقة تكرار، ثم استخدام التعبير break أو continue للإشارة إلى أنَّ إيقاف تنفيذ حلقة التكرار أو إكمال تنفيذها مع التكرار التالي.

لاحظ أنَّ JavaScript لا تملك التعبير البرمجي goto، ولا يمكنك استخدام اللافتات إلا مع التعبير break أو continue.

في نمط strict لن تتمكن من استخدام السلسلة النصية "let" كلافتة، فسترمي الخطأ SyntaxError (لأنَّ let هو مُعرِّف محجوز في JavaScript).

أمثلة

استخدام حلقة for لها لافتة مع continue

لاحظ كيف عرّفنا لافتةً لحلقة التكرار الأولى (loop1) وحلقة التكرار الثانية (loop2)، وكيف استخدمنا التعبير البرمجي continue داخل حلقة التكرار الثانية للانتقال إلى حلقة التكرار الأولى مباشرةً.

انتبه إلى عدم وجود الناتج i = 1, j = 1 ولا i = 1, j = 2:

var i, j;

loop1:
for (i = 0; i < 3; i++) {      // "loop1"
   loop2:
   for (j = 0; j < 3; j++) {   // "loop2"
      if (i === 1 && j === 1) {
         continue loop1;
      }
      console.log('i = ' + i + ', j = ' + j);
   }
}

//  الناتج
//   "i = 0, j = 0"
//   "i = 0, j = 1"
//   "i = 0, j = 2"
//   "i = 1, j = 0"
//   "i = 2, j = 0"
//   "i = 2, j = 1"
//   "i = 2, j = 2"

المثال الآتي فيه مصفوفةُ عناصر ومصفوفة اختبارات، وسنحصي عدد العناصر التي تجاوزت جميع الاختبارات:

var itemsPassed = 0;
var i, j;

top:
for (i = 0; i < items.length; i++) {
  for (j = 0; j < tests.length; j++) {
    if (!tests[j].pass(items[i])) {
      continue top;
    }
  }

  itemsPassed++;
}

استخدام حلقة for لها لافتة مع break

لاحظ الاختلافات بين المثال الآتي والمثال في القسم السابق (الذي استعملنا فيه التعبير continue):

var i, j;

loop1:
for (i = 0; i < 3; i++) {      // "loop1"
   loop2:
   for (j = 0; j < 3; j++) {   // "loop2"
      if (i === 1 && j === 1) {
         break loop1;
      }
      console.log('i = ' + i + ', j = ' + j);
   }
}

//  الناتج
//   "i = 0, j = 0"
//   "i = 0, j = 1"
//   "i = 0, j = 2"
//   "i = 1, j = 0"

استخدام قسم كتلي له لافتة مع break

يمكنك استخدام اللافتات مع الأقسام الكتلية البسيطة، لكن لا يُسمَح إلا باستخدام التعبير break معها:

foo: {
  console.log('face');
  break foo;
  console.log('this will not be executed');
}
console.log('swap');

// "face"
// "swap

استخدام لافتات عند التصريح عن الدوال

بدءًا من ECMAScript 2015، يمكن استخدام لافتات عند التصريح عن الدوال (function declarations) وذلك في نمط non-strict:

L: function F() {}

لكن ذلك سيرمي الخطأ SyntaxError في نمط strict:

'use strict';
L: function F() {}
// SyntaxError: functions cannot be labelled

يجدر بالذكر أنَّ الدوال المولِّدة (generator functions) لا يمكن إضافة لافتات إليها في كلا النمطين:

L: function* F() {}
// SyntaxError: generator functions cannot be labelled

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

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

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