في JS ، غالبًا ما تواجه مواقف حيث يتم استدعاء وظائف أخرى في الوظائف. في هذا الوقت ، ستكون هناك طريقة استدعاء مثل FN () ، وأخرى هي طريقة استدعاء مثل الإرجاع FN (). غالبًا ما يتم الخلط بين بعض المبتدئين من هاتين الطريقتين. نستخدم هنا سؤال مقابلة أنيقة لتحليل الاختلافات بين الطريقتين.
var i = 0 ؛ function fn () {i ++ ؛ if (i <10) {fn () ؛ } آخر {return i ؛ }} var result = fn () ؛ console.log (result) ؛هذا سؤال مقابلة مع المزالق الخفية. يبدو الأمر بسيطًا جدًا. قد يجيب معظم الناس على 10 دون تفكير. في الواقع ، يمكن ملاحظة أن ما هو مطبوع غير محدد. يعكس سؤال الفخ هذا بشكل حدسي المشكلة المذكورة أعلاه. عندما نقوم بتعديل الخط الذي ينفذ FN إلى:
var i = 0 ؛ function fn () {i ++ ؛ if (i <10) {return fn () ؛ } آخر {return i ؛ }} var result = fn () ؛ console.log (result) ؛في هذا الوقت ، ستجد أن النتيجة المطبوعة هي 10.
لماذا يوجد فرق كبير بين إضافة أو عدم إضافة عائد هنا؟
السبب الرئيسي هنا بسيط للغاية. وظائف JavaScript لها قيم الإرجاع الافتراضية. إذا لم تكتب الوظيفة عودة في النهاية ، فسيتم إرجاع غير محدد افتراضيًا. لهذا السبب في وحدة التحكم في الكروم ، عند كتابة رمز ، غالبًا ما يظهر خط غير محدد أدناه.
دعنا نلقي نظرة فاحصة على هذا المثال. عندما تزيد إلى 9 ، تكون هذه هي المرة الثانية التي يطلق فيها FN بشكل متكرر للوقت قبل الأخير. إذا لم يكن هناك عودة ، بعد تنفيذ FN هذه المرة ، فإن العودة غير المحددة افتراضيًا ، ولن تستمر العودة التالية. عند إضافة العائد ، ستستمر العودية الأخيرة هنا ، أي عندما أكون = 10 ، القفز إلى آخر والعودة للحصول على العشرة الصحيحة.
الحديث عن هذا ، يمكننا تمديد مثال أكثر كلاسيكية ، طريقة البحث الثنائي الشهير:
var mid = math.floor ((arr.length - 1) / 2) ؛ function search (n ، mid) {if (n> arr [mid]) {mid = math.floor ((mid + arr.length) / 2) ؛ إرجاع البحث (N ، منتصف) ؛ } آخر إذا (n <arr [mid]) {mid = math.floor ((mid - 1) / 2) ؛ إرجاع البحث (N ، منتصف) ؛ } آخر {return mid ؛ }} var index = search (n ، mid) ؛ console.log (index) ؛تتطلب طريقة البحث الثنائي أيضًا مكالمات متعددة متكررة. غالبًا ما يرتكب العديد من المبتدئين أخطاء عند تنفيذ هذه الخوارزمية لأول مرة. هو أن ننسى إضافة عائد قبل الوظيفة العودية ، مما يؤدي في النهاية إلى أن تكون نتيجة العودة غير محددة. السبب هنا يشبه واحد السابق. إذا لم تقم بإضافة عائد ، فسيؤدي ذلك إلى إرجاع غير محدد مباشرة بعد العودة ، ولن تستمر مع العودية التالية.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.