如何将函数参数传递给另一个内部函数的参数

3

当我查看MDN以了解有关闭包的一些知识点时,我遇到了下面的函数。

这可能是javascript中一个已知的模式,但对于Java或.NET开发人员来说很奇怪。 我想知道它是如何工作的,我知道在javascript语言中关于参数和一等对象的行为,但是如何将add5(2)赋值为2个y变量。

function makeAdder(x) {
    return function(y) {
        return x + y;
    };
}

var add5 = makeAdder(5);
var add10 = makeAdder(10);

console.log(add5(2));  // 7
console.log(add10(2)); // 12

2
我想我明白了,因为makeAdder(x)返回函数(y),所以add5的值是函数(y),所以当我执行add5(2)时,我将2传递给y。 - Marzouk
1
阅读https://dev59.com/6XVD5IYBdhLWcg3wBm5h?rq=1。 - Jaromanda X
4个回答

2
首先,任何时候只要存在命名参数,就会有隐式的变量声明。因此,请忘记上面的函数,只需考虑以下内容。
var example = function() {
  var x = 5;
  return function(y) {
    return x + y;
  }
}
var inner = example();
console.log(inner(5));
> '10'

你理解上面的内容吗?如果不理解,我建议你了解一下JavaScript闭包以及它的含义。

JavaScript闭包

在上面的函数makeAdder中,唯一的区别是我们传递了x的值。但是x仍然在外部函数中定义,返回的函数将其值封闭起来。


1

makeAdder 返回一个函数,可以看作是:

var x = 5;
function add5(y){
    return x + y;
}

1

makeAdder(5) 调用了函数 makeAdder,并将 x 绑定为 5。该函数返回另一个函数。此外,由于提供了 x 的值,makeAdder 内部的匿名函数知道 x 的值。此时,makeAdder 将返回:

function(y) {
   return 5 + y;
}

因此,通过将这个新函数分配给add5,add5现在也是一个函数。如果我们调用add5(2),它将使用上述函数,并执行以下操作:
function(2) {
  return 5 + 2;
}

这将输出7。

这是如何工作的?

闭包中定义的函数“记住”了它被创建时的环境。

ref


1

函数makeAdder返回一个函数,因此变量add5add10只是对函数的引用。当您使用参数值调用这些函数时,该参数作为函数中的参数y

例如,在C#中也可以做到这一点,闭包的工作方式相同:

public static Func<int, int> MakeAdder(int x) {
  return y => x + y;
}

使用它:
Func<int, int> add5 = MakeAdder(5);
Func<int, int> add10 = MakeAdder(10);

Console.WriteLine(add5(2));
Console.WeiteLine(add10(2));

我知道还有其他很好的答案,但是这个答案对我来说真的很棒,它用我能理解的语言与我交流,谢谢。 - Marzouk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接