"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > أسئلة وأجوبة المقابلة في الرفع

أسئلة وأجوبة المقابلة في الرفع

تم النشر بتاريخ 2024-11-02
تصفح:982

Interview Questions and Answers in Hoisting

1. ما هو الرفع في جافا سكريبت؟

الإجابة: الرفع هو العملية التي تتم أثناء مرحلة إنشاء سياق التنفيذ حيث يتم تخصيص الذاكرة للمتغيرات والوظائف. أثناء هذه العملية، يتم تخصيص ذاكرة المتغيرات، ويتم تعيين قيمة غير محددة للمتغيرات. بالنسبة للوظائف، يتم تخزين تعريف الوظيفة بالكامل على عنوان محدد في الذاكرة، ويتم وضع مرجع لها على المكدس في سياق التنفيذ المحدد.

2. ما هو الفرق بين الرفع المتغير والرفع الوظيفي؟

الإجابة: يحدث رفع المتغير عندما يتم نقل تعريف المتغير إلى أعلى نطاقه. من ناحية أخرى، يحدث رفع الوظيفة عندما يتم نقل الوظيفة بأكملها، بما في ذلك جسمها، إلى أعلى نطاقها.

3. كيف يعمل الرفع في جافا سكريبت؟

الإجابة: الرفع عبارة عن آلية جافا سكريبت حيث يتم نقل إعلانات المتغيرات والوظائف إلى أعلى نطاقها قبل بدء تنفيذ التعليمات البرمجية. بسبب الرفع، يمكننا استخدام المتغيرات قبل الإعلان عنها.

  • رفع المتغير: عندما يتم الإعلان عن متغير، يتم نقله إلى أعلى نطاقه، ويمكننا استخدام هذا المتغير حتى قبل الإعلان عنه في الكود.

  • وظيفة الرفع: عندما يتم رفع وظيفة، يتم نقل جسم الوظيفة بأكمله إلى أعلى نطاقها. هذا يعني أنه يمكننا استدعاء الدالة حتى قبل الإعلان عنها في الكود.

4. ما هي قيمة المتغير الذي تم الإعلان عنه ولكن لم تتم تهيئته؟

الجواب: إذا قمت بتعريف متغير ولكن لم تقم بتعيين قيمة له، فإن المتغير يعتبر بلا قيمة. تقوم JavaScript بنقل إعلان المتغير إلى الأعلى أثناء الرفع، ولكن لم يتم تعيين قيمة للمتغير بعد. تم تعيين المتغير غير محدد، مما يعني أن المتغير لم يتلق أي قيمة بعد.

5. ماذا يحدث إذا قمت بتعريف متغير مرتين في نفس النطاق؟

الجواب: إذا قمت بتعريف نفس المتغير مرتين في نفس النطاق، فسيحل الإعلان الثاني محل الأول، وسيتم استبدال قيمة الإعلان الأول بالثاني. يحدث هذا لأن جافا سكريبت تخزن الإعلان الأول في الذاكرة، وعندما تواجه الإعلان الثاني، فإنها تقوم بالكتابة فوق القيمة السابقة.

6. هل يمكنك رفع متغير دون استخدام الكلمة الأساسية var؟

الإجابة: نعم، في JavaScript، يمكنك رفع المتغيرات باستخدام Let أو const بدلاً من var. على الرغم من أن var تم استخدامه بشكل تقليدي، إلا أنه يحتوي على بعض المشكلات المتعلقة بالنطاق، ولهذا السبب يوصى باستخدام Let أو const.

مثال مع Let:

let myVariable = 42;
console.log(myVariable); // Output: 42

مثال مع const:

const pi = 3.14159;
console.log(pi); // Output: 3.14159

المتغيرات المعلنة باستخدام Let وconst لها نطاق على مستوى الكتلة، مما يعني أنها محصورة في الكتلة (مثل دالة أو حلقة أو بيان) حيث تم تعريفها. يسمح بإعادة التعيين، بينما يُستخدم const للثوابت ولا يمكن إعادة تعيينه.

7. ما الفرق بين إعلان الوظيفة وتعبير الوظيفة من حيث الرفع؟

الإجابة: يتم رفع تعريف الوظيفة إلى أعلى نطاقها، في حين أن تعبير الوظيفة ليس كذلك. هذا يعني أنه يمكنك استدعاء دالة مُعلن عنها بإعلان دالة قبل تعريفها، لكن لا يمكنك فعل الشيء نفسه مع تعبير دالة.

8. ما هو نطاق المتغير المرفوع؟

الإجابة: يعتمد نطاق المتغير المرفوع على مكان الإعلان عنه. إذا تم الإعلان عن المتغير داخل دالة، فإن نطاقه يقتصر على تلك الدالة، مما يعني أنه لا يمكن الوصول إليه خارجها. إذا تم الإعلان عن متغير خارج أي دالة، فسيكون له نطاق عالمي، مما يعني أنه يمكن الوصول إليه من أي مكان في الكود.

9. كيف يمكنك منع الرفع في JavaScript؟

الإجابة: لا يمكن منع الرفع تمامًا في JavaScript، ولكن يمكنك كتابة التعليمات البرمجية الخاصة بك بطريقة تتجنب المشكلات المحتملة الناجمة عنها. إحدى الطرق للقيام بذلك هي الإعلان عن جميع المتغيرات والوظائف في الجزء العلوي من نطاقها.

في أمثلة التعليمات البرمجية أعلاه، تم الإعلان عن جميع المتغيرات والوظائف في الجزء العلوي من الكتلة الخاصة بها باستخدام var أو Let. وهذا يضمن رفع المتغيرات والوظائف داخل كتلتها وظهورها في الجزء العلوي من نطاقها.

هذه الطريقة تجعل تدفق التعليمات البرمجية والقيم المتغيرة أكثر قابلية للتنبؤ بها، مما يساعد على تقليل التباين والأخطاء المحتملة.

10. ما هي المخاطر المحتملة للرفع في جافا سكريبت؟

الإجابة: يمكن أن يؤدي الرفع إلى مشكلات محتملة إذا لم تفهم بشكل كامل كيفية عمله، مما يؤدي إلى سلوكيات غير متوقعة. على سبيل المثال، إذا قمت بتعريف متغير داخل عبارة كتلة وحاولت الوصول إليه خارج الكتلة، فقد يتم رفع المتغير إلى أعلى الوظيفة أو النطاق العام، وهو ما قد لا يكون ما قصدته.

  • نطاق الكتلة والرفع: قد تظل المتغيرات المعلنة داخل الكتلة مرفوعة إلى أعلى نطاقها.

  • صعوبة تصحيح الأخطاء: قد يؤدي الرفع إلى صعوبة تصحيح الأخطاء لأن القيمة أو المتغير الذي تحاول الوصول إليه قد لا يعمل كما هو متوقع.

  • مراوغات تعريف الوظيفة: يتم رفع الوظائف إلى أعلى نطاقها، ولكن قد لا تستخدمها دائمًا بالطريقة التي تتوقعها.
    للتعامل مع مشكلات الرفع هذه، من المهم الإعلان عن المتغيرات والوظائف الخاصة بك بوضوح وفهم كيفية عمل الرفع ضمن التعليمات البرمجية الخاصة بك.

11. هل يمكن للرفع تغيير ترتيب التنفيذ في JavaScript؟

الإجابة: نعم، يؤدي الرفع في JavaScript إلى نقل إعلانات المتغيرات والوظائف إلى أعلى النطاقات الخاصة بها قبل بدء تنفيذ التعليمات البرمجية. يمكن أن يؤدي هذا إلى تغيير التدفق المتوقع لتنفيذ التعليمات البرمجية.
باستخدام الرفع، يمكنك الإعلان عن متغير واستخدامه قبل تعريفه فعليًا، مما قد يغير الترتيب المتوقع لتنفيذ التعليمات البرمجية ويؤدي إلى نتائج غير مقصودة.
على سبيل المثال، إذا لم تحدد الوظائف في بداية البرنامج النصي ثم استخدمتها لاحقًا، فسيتم رفعها إلى الأعلى، مما قد يؤدي إلى إنشاء تدفق وسلوك غير متوقع في التعليمات البرمجية.

12. ما الفرق بين الرفع في var وتصريحات Let؟

الإجابة: يتم رفع إعلانات var إلى أعلى نطاقها، بينما يتم رفع إعلانات Let إلى أعلى الكتلة الخاصة بها. هذا يعني أن المتغيرات المعلنة باستخدام Let لا يمكن الوصول إليها خارج الكتلة الخاصة بها.

دعونا نلقي نظرة على مثال لتوضيح ذلك:

function example() {
    console.log(x); // undefined
    var x = 5;
    console.log(x); // 5
}
example();
console.log(x); // ReferenceError: x is not defined

هنا، var x = 5; يتم رفعه إلى أعلى نطاق الوظيفة. ومع ذلك، عند استدعاء console.log(x) قبل الإعلان، تكون القيمة غير محددة بسبب الرفع.

الآن دعونا نلقي نظرة على مثال مع Let:

function example() {
    console.log(y); // ReferenceError: y is not defined
    let y = 10;
    console.log(y); // 10
}
example();
console.log(y); // ReferenceError: y is not defined

هنا، دع y = 10؛ تم رفعه إلى أعلى نطاق الكتلة الخاص به، ولكن محاولة الوصول إليه قبل إعلانه يؤدي إلى خطأ مرجعي.

باختصار، يتم رفع متغيرات var إلى أعلى نطاق الوظيفة، بينما يتم رفع متغيرات Let إلى أعلى الكتلة الخاصة بها.

13. ماذا يحدث إذا حاولت الوصول إلى متغير مرفوع قبل الإعلان عنه؟

الإجابة: إذا حاولت الوصول إلى متغير مرفوع قبل الإعلان عنه، فستكون قيمته غير محددة.

14. ما هو سلوك الرفع لوظائف الأسهم في JavaScript؟

الإجابة: لا يتم رفع وظائف السهم في JavaScript، لذلك لا يمكنك استدعاء وظيفة السهم قبل تعريفها.

// This will work
function regularFunction() {
    console.log("This is a regular function");
}
regularFunction(); // "This is a regular function"
// This will not work
arrowFunction(); // TypeError: arrowFunction is not a function
const arrowFunction = () => {
    console.log("This is an arrow function");
};

هنا، يتم رفع الدالة العادية ويمكن استدعاؤها قبل تعريفها، ولكن لم يتم رفع وظيفة السهم، لذا فإن استدعائها قبل تعريفها سيؤدي إلى خطأ.

15. هل يمكن أن يتم الرفع داخل الوظيفة؟

الجواب: نعم، يمكن أن يحدث الرفع داخل الوظيفة. وهذا يعني أن المتغيرات أو الوظائف المعلنة داخل الوظيفة يتم رفعها إلى أعلى نطاق تلك الوظيفة.

16. ما هي سلسلة النطاق في JavaScript؟

الإجابة: في JavaScript، سلسلة النطاق هي التسلسل الهرمي للنطاقات التي يستخدمها محرك JavaScript للبحث عن قيمة المتغير. تتضمن سلسلة النطاق نطاق الوظيفة الحالية ونطاقات الوظائف الخارجية والنطاق العالمي.

تعمل سلسلة النطاق كعملية خطوة بخطوة للعثور على قيمة المتغير. إذا تم الإعلان عن متغير أو دالة داخل دالة، فإن محرك JavaScript يبحث أولاً ضمن نطاق تلك الوظيفة. إذا لم يتم العثور على القيمة هناك، فإنه يبحث في الوظيفة الخارجية ويستمر في هذه العملية حتى تصل إلى النطاق العالمي.
بهذه الطريقة، تستخدم JavaScript سلسلة النطاق للعثور على قيم متغيرة وتقوم بتحديث السلسلة وفقًا لمكان تعريف المتغير.

17. ما هو ناتج مقتطف الكود التالي؟

إجابة:

console.log(a);
var a = 10;
Output: undefined

18. ما هو ناتج مقتطف الكود التالي؟

إجابة:
خطأ مرجعي: لم يتم تعريف
في هذه الحالة، يتم الإعلان عن a باستخدام Let، مما يعني أنه لم يتم رفعه إلى أعلى نطاقه. بما أنه لم يتم تعريف a قبل بيان console.log()، فسيتم طرح خطأ مرجعي.

19. ما هو ناتج مقتطف الكود التالي؟

إجابة:

var a = 5;
(function() {
    console.log(a); // undefined
    var a = 10;
})();
Output: undefined

لفهم هذه العملية بشكل كامل، دعونا نقسمها خطوة بخطوة:

في السطر الأول، var a = 5; يقوم بإنشاء متغير a بقيمة 5 في النطاق العالمي.
بعد ذلك، يتم تعريف واستدعاء تعبير دالة يتم استدعاؤه على الفور (IIFE).
داخل الوظيفة، console.log(a); يحاول طباعة قيمة a. ومع ذلك، لأن var a = 10; تم الإعلان عنه داخل الوظيفة، وتم رفع المتغير المحلي a إلى خارج نطاق الوظيفة، ولكن لم يتم تعيين قيمته بعد، لذلك يطبع غير محدد.
بعد ذلك، var a = 10; يقوم بإنشاء متغير جديد في النطاق المحلي بقيمة 10.
وبالتالي، فإن console.log(a); طباعة غير محددة بسبب الرفع، وبعد التصريح يتم تحديث قيمة a إلى 10.

20. ماذا سيكون ناتج مقتطف الكود التالي؟

إجابة:

function test() {
  console.log(a);
  var a = 10;
  console.log(a);
}
test();
Output:
undefined
10

يتم تعريف اختبار الوظيفة () ببيانين console.log():

في console.log(a); تم الإعلان عن المتغير a داخل الدالة ولكن لم يتم تعيين قيمة له بعد، لذا فهو يطبع غير محدد.
في console.log(a); يتم تعيين القيمة 10 للمتغير a، والتي يتم طباعتها كـ 10.
وبالتالي، عندما يتم استدعاء الدالة، يتم استخدام console.log(a); الأول. يطبع غير محدد، والثاني console.log(a); المطبوعات 10.

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/nozibul_islam_113b1d5334f/interview-questions-and-answers-in-hoisting-l0a?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3