不带参数的匿名函数 return 本身带参数

Anonymous function without arguments return itself with arguments

我正在学习javascript,见过这样写的匿名函数,没有任何解释:

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

我看的方式是:匿名声明一个函数,赋值给const sum。使用参数调用 sum() 并 console.log() 结果。

这让我很困惑,因为我不明白为什么要这样写。一些问题是:

当最外层函数没有指定参数时,sum如何接受参数? 为什么我们不在最外层函数上指定参数??为什么它会自行返回,而 'sum' 何时被调用?

如果它太愚蠢或太明显,我们深表歉意。纠结了好久,终于决定在这里问一下。

首先这个函数不仅仅是匿名的。它是一个 iife(立即调用函数)并且返回 sum 函数。所以 const 变量 sum 实际上是 iife 函数返回的 sum 函数。

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

因此,上面一行中的 sum 指的是 iife 函数返回的函数 sum 而不是 iife 函数本身

更多了解 iife 检查 - https://developer.mozilla.org/en-US/docs/Glossary/IIFE

为了更好的理解,我们可以展开为:

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 是密封的,不会暴露在您的全局环境中。