запутался в синтаксисе функции js

1

Я делал некоторые синтаксические практики ES6 на freecodecamp.org, имея некоторые трудности для понимания контекста. Я знаю, что это называется IIFE в JS,

(function () {
    statements
})();

Итак, это нормально, но почему бы мне не получить ..args внутри первой sum и вместо внутренней sum?

const sum = (function(...args) {
  console.log(...args); //this shows nothing
  return function sum(...args) {
    console.log(...args); // this shows 1,2,3
    return args.reduce((a, b) => a + b, 0);
  };
})();
console.log(sum(1, 2, 3)); // 6

Что делать, если я модифицирую приведенный выше фрагмент, они делают то же самое правильно? есть ли какое-то логическое различие, происходящее под капотом?

function sum(...args) {
  console.log(args);
  return args.reduce((a, b) => a + b, 0);
}
console.log(sum(1, 2, 3)); // 6

Основная проблема заключается в том, почему sum функций возвращает в нее еще одну sum функций.

  • 0
    Uncaught SyntaxError: Illegal 'use strict' directive in function with non-simple parameter list
  • 0
    @CertainPerformance отредактировано, это была просто копия вставки :)
Теги:
ecmascript-6
function

1 ответ

4
Лучший ответ

В первом коде IIFE вызывается без аргументов, см.

})();

Таким образом, результирующий массив args пуст, когда он распространяется в список параметров, результирующий список параметров пуст; вести журнал нечего. console.log с пустым списком параметров ничего не делает. Он будет записывать что-то, если вы вызывали IIFE с хотя бы одним аргументом:

const sum = (function(...args) {
  // Now, it shows something!
  console.log(...args);
  return function sum(...args) {
    console.log(...args); // this shows 1,2,3
    return args.reduce((a, b) => a + b, 0);
  };
})(9999);
console.log(sum(1, 2, 3)); // 6

Во втором коде есть только одна функция, а не функция, завернутая внутри другой функции, и что одна функция всегда вызывается с параметрами. Если вы вызвали его без параметров и распространили их в console.log, вы увидите тот же эффект:

function sum(...args) {
  console.log(...args);
  return args.reduce((a, b) => a + b, 0);
}
sum(); // 6
  • 0
    Ох, дерьмо ... Я знал это ... Как я это забыл? Только Бог знает !!!! Я могу передать аргументы IIFE . в конце, спасибо, что очень хорошо напомнили мне старую вещь, еще раз спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню