Функция стрелки не работает, но с использованием функции работает по-старому

Я пытаюсь быть крутым и современным и использовать функцию стрелки es6 js, но потерпел неудачу с первой попытки.

Почему эта стрелочная функция sumRange НЕ работает:

    var output = sumRange(3);
    console.info(output);    

sumRange = (num) => {
            if (num == 1) return 1;
            console.info(num);
            return  num + sumRange(num - 1);
        }

Но здесь функция ДЕЙСТВИТЕЛЬНО работает:

   var output = sumRange(3);
console.info(output);

function sumRange(num){
    if (num == 1) return 1;
    console.info(num)
    return num + sumRange(num - 1);
}
function операторы объявлений обрабатываются так, как если бы они появились в самом верху объемлющей области видимости. Если вы переместите первые две строки в после точку, в которой вы инициализируете sumRange, ваш первый фрагмент кода будет работать.
Pointy 10.04.2019 14:36
sumRange = function (num) { ... } тоже не работает
hackape 10.04.2019 14:37

Посмотрите ответы на связанный вопрос, они применимы как к выражениям стрелочных функций, так и к традиционным функциональным выражениям.

T.J. Crowder 10.04.2019 14:40

Первое, что нужно сделать в этой ситуации, это посмотреть на ошибку в ошибке в веб-консоли, что даст вам подсказку о том, в чем проблема. (В вашем случае: Ucaught ReferenceError: someRange is not defined).

T.J. Crowder 10.04.2019 14:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Принесите console.info() после объявления функции стрелки.

Примечание: вы не объявляете функцию ни с одним ключевым словом. Вы должны использовать letvar или const для объявления функции.

let sumRange = (num) => {
    if (num == 1) return 1;
    console.info(num);
    return  num + sumRange(num - 1);
}

var output = sumRange(3);
console.info(output);           
        

Почему второй работает?

Потому что это оператор функции. И его можно использовать даже до его объявления.

Function declarations in JavaScript are hoisted to the top of the enclosing function or global scope. You can use the function before you declared it

"В глобальном масштабе все нормально..." Нет, неявные глобальные переменные всегда неуместны. :-)
T.J. Crowder 10.04.2019 14:41

@ T.J.Crowder Я не знал об этом, не могли бы вы немного объяснить.

Maheer Ali 10.04.2019 14:42

См. Ужас неявных глобальных переменных в моем маленьком анемичном блоге. Даже если в глобальной области объявите свои переменные. (Лучше всего: вообще не создавайте глобальные переменные.)

T.J. Crowder 10.04.2019 14:43

Другие вопросы по теме