Анонимная функция без аргументов возвращает себя с аргументами - PullRequest
2 голосов
/ 15 марта 2020

Я изучаю javascript и видел анонимные функции, написанные так, без какого-либо объяснения:

const sum = (function() {
    return function sum(x,y,z){
        return (x+y+z);
    };
})();
console.log(sum(1,2,3)); //6

Я прочитал это так: объявить функцию анонимно и присвоить ей постоянную сумму. Вызовите sum () с параметрами и console.log () с результатами.

Меня это очень смущает, так как я не понимаю, почему написано так, как оно есть. Вот некоторые вопросы:

Каким образом принимаются параметры суммирования, если для самой внешней функции не заданы параметры? Почему мы не указываем параметры самой внешней функции ?? Почему он возвращается сам и какую «сумму» вызывают, когда?

Извинения, если она слишком глупа или очевидна. Я много боролся и наконец решил спросить здесь.

Ответы [ 2 ]

1 голос
/ 15 марта 2020

Для лучшего понимания мы можем расширить его до:

const _sum2 = function() { // anonymous function
    return function sum(x,y,z){
        return (x+y+z);
    };
}

const sum = _sum2(); // value of _sum2 returns
// it is the same as
const sum = function sum(x,y,z){
    return (x+y+z);
}
console.log(sum(1,2,3));

Проверьте сами:

const sum = (function() {
    return function sum(x,y,z){
        return (x+y+z);
    };
})();
console.log('const sum = ' + sum.toString());

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

const sum = (function() {
    const n = 10;
    function protected() {
        return n;
    }
    return function sum(x,y,z){
        return protected() * (x+y+z);
    };
})();
console.log(sum(1,2,3));  // evaluates to 60

функция protected и переменная n запечатаны и не подвержены воздействию вашей глобальной среды.

1 голос
/ 15 марта 2020

Прежде всего эта функция не только анонимная. это iife (немедленно вызывающая функция), и она возвращает функцию sum. Таким образом, константная переменная sum на самом деле является функцией суммы, которая возвращается функцией iife.

console.log(sum(1,2,3));

Таким образом, в приведенной выше строке сумма относится к функции sum, возвращаемой функцией iife, а не самой функции iife.

Для большего понимания проверки iife - https://developer.mozilla.org/en-US/docs/Glossary/IIFE

...