Я пытаюсь быть крутым и современным и использовать функцию стрелки 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);
}
sumRange = function (num) { ... }
тоже не работает
Посмотрите ответы на связанный вопрос, они применимы как к выражениям стрелочных функций, так и к традиционным функциональным выражениям.
Первое, что нужно сделать в этой ситуации, это посмотреть на ошибку в ошибке в веб-консоли, что даст вам подсказку о том, в чем проблема. (В вашем случае: Ucaught ReferenceError: someRange is not defined
).
Принесите console.info()
после объявления функции стрелки.
Примечание: вы не объявляете функцию ни с одним ключевым словом. Вы должны использовать let
var
или 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 Я не знал об этом, не могли бы вы немного объяснить.
function
операторы объявлений обрабатываются так, как если бы они появились в самом верху объемлющей области видимости. Если вы переместите первые две строки в после точку, в которой вы инициализируетеsumRange
, ваш первый фрагмент кода будет работать.