Я делал некоторые синтаксические практики 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
функций.
В первом коде 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
IIFE
. в конце, спасибо, что очень хорошо напомнили мне старую вещь, еще раз спасибо.
Uncaught SyntaxError: Illegal 'use strict' directive in function with non-simple parameter list