В JS вы часто сталкиваетесь с ситуациями, когда другие функции вызываются в функциях. В настоящее время будет метод вызовов, такой как fn (), а другой - это метод вызова, например, return fn (). Некоторые новички часто сбиваются с толку этими двумя методами. Здесь мы используем элегантный вопрос интервью для анализа различий между двумя методами.
var i = 0; function fn () {i ++; if (i <10) {fn (); } else {return i; }} var result = fn (); console.log (result);Это вопрос интервью со скрытыми ловушками. Это кажется очень простым. Большинство людей могут ответить 10, не задумываясь. На самом деле можно увидеть, что то, что напечатано, не определен. Этот вопрос ловушки интуитивно отражает проблему, упомянутую выше. Когда мы изменяем строку, выполняющую FN на:
var i = 0; function fn () {i ++; if (i <10) {return fn (); } else {return i; }} var result = fn (); console.log (result);В настоящее время вы обнаружите, что печатный результат составляет 10.
Почему существует такая большая разница между добавлением или не добавлением возврата сюда?
Основная причина здесь очень проста. Функции JavaScript имеют возвращаемые значения по умолчанию. Если функция не записывает возвращение в конце, не определено будет возвращено по умолчанию. Вот почему в хромированной консоли при написании кода линия неопределенного часто появляется ниже.
Давайте поближе посмотрим на этот пример. Когда я увеличивается до 9, это второй раз, когда FN называется рекурсивно в предпоследнее время. Если нет возврата, после того, как FN будет выполнен на этот раз, верните неопределенную по умолчанию, а следующая рекурсия не будет продолжаться. При добавлении возврата последняя рекурсия будет продолжаться здесь, то есть, когда я = 10, перейти к другому и вернуться, чтобы получить правильные 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, середина); } else if (n <arr [mid]) {mid = math.floor ((mid - 1) / 2); вернуть поиск (n, середина); } else {return mid; }} var index = search (n, mid); console.log (index);Метод бинарного поиска также требует нескольких рекурсивных вызовов. Многие новички часто совершают ошибки при внедрении этого алгоритма впервые. Это следует забыть добавить возврат перед рекурсивной функцией, что в конечном итоге приводит к не определенным результатам возврата. Причина здесь похожа на предыдущий. Если вы не добавите возврат, это заставит вас вернуть неопределенную сразу после рекурсии, и вы не будете продолжать следующую рекурсию.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.