javascript 不带参数的匿名函数返回带参数的自身

uinbv5nw  于 2023-01-11  发布在  Java
关注(0)|答案(3)|浏览(92)

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

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

我是这么读的:匿名声明一个函数,并将其赋给const sum。2调用sum()函数的参数,调用console.log()函数的结果。
这让我很困惑,因为我不明白为什么要这样写。一些问题是:
当最外层的函数没有指定参数时,sum如何接受参数?为什么我们不指定最外层函数的参数?为什么它返回自己?什么时候调用哪个'sum'?
如果太愚蠢或太明显,我道歉。我挣扎了很久,终于决定在这里问。

4xrmg8kj

4xrmg8kj1#

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

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

因此,在上面的行中,sum指的是iife函数返回的函数sum,而不是iife函数本身
有关生命周期检查-https://developer.mozilla.org/en-US/docs/Glossary/IIFE的更多信息

kknvjkwl

kknvjkwl2#

为了更好地理解,我们可以将其扩展为:

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());

这样的语法是用来保护中间变量和函数的。2在你的例子中没有这样的变量,但是:

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是密封的,不会向全局环境公开。

whitzsjs

whitzsjs3#

对于初学者来说,下面的代码中充满了令人困惑的不必要的错误信息:

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

1.外部匿名函数是不必要的,因为没有内部变量或函数需要保护--那么为什么要使用它呢?它只会让人感到困惑!!
1.为什么用“sum”来命名内部返回的匿名函数呢?它与常量和无关,只会在这里引起更多的混乱!!
1.所有上述代码是完全不必要的,多余的,和混乱时,考虑到以下是相同的:

const sum = (x, y, z) => x + y + z;
console.log(sum(1,2,3));

相关问题