في JavaScript، إعلانات الوظائف لها سلوك مختلف اعتمادًا على معيار اللغة السائد والبيئة التي يتم تنفيذها فيها.
في الوضع الصارم (ES5)
في الوضع الصارم، المقدم في ECMAScript 5 (ES5)، لا يُسمح بإعلانات الوظائف ضمن البيانات الشرطية. وذلك لأن إعلانات الوظائف تنشئ متغيرات مرفوعة، والتي يتم تحديد نطاقها للوظيفة بأكملها أو النطاق العام. سيؤدي وضعها ضمن عبارة شرطية إلى كسر آلية الرفع هذه.
الوضع غير الصارم (ES5)
في الوضع غير الصارم، ومع ذلك، فإن سلوك إعلانات الوظائف ضمن البيانات الشرطية كان لا يمكن التنبؤ به. نفذت المتصفحات المختلفة ومحركات جافا سكريبت قواعدها الخاصة للتعامل مع هذا الموقف، مما أدى إلى نتائج غير متناسقة.
في JavaScript الحديثة (ES2015)
اعتبارًا من عام 2018، أصبحت معظم المتصفحات الحديثة دعم ECMAScript 2015 (ES2015)، الذي قدم تفسيرًا أكثر صرامة لإعلانات الوظائف داخل الكتل. في ES2015، يتم تحديد نطاق إعلانات الوظائف إلى الكتلة التي تم الإعلان عنها.
مثال:
خذ بعين الاعتبار الكود التالي:
var abc = '';
if (1 === 0) {
function a() {
abc = 7;
}
} else if ('a' === 'a') {
function a() {
abc = 19;
}
} else if ('foo' === 'bar') {
function a() {
abc = 'foo';
}
}
a();
document.write(abc); //writes "foo" even though 'foo' !== 'bar'
في الوضع الصارم أو في ES2015، قد يؤدي هذا الرمز إلى خطأ لأن الوظيفة a غير محددة في النطاق العام. ومع ذلك، في الوضع غير الصارم، قد ينتج مخرجات مختلفة اعتمادًا على التنفيذ. في المثال الموضح، يُخرج Chrome "foo" بينما يُخرج Firefox "19".
توصية:
لتجنب السلوك غير المتوقع، يوصى باستخدام التعبيرات الوظيفية بدلاً من ذلك. إعلانات الوظائف عند تعريف الوظائف بشكل مشروط. تقوم تعبيرات الوظائف بإنشاء وظائف محددة لا يمكن الوصول إليها إلا ضمن نطاقها المباشر.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3