这个函数如何将实参传递给另一个内部函数形参

How this function passes arguments to another inner function parameters

本文关键字:另一个 内部函数 形参 实参 函数      更新时间:2023-09-26

当我查看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

首先,任何有命名参数的地方都有一个隐式的变量声明。所以忘记上面的函数,只考虑这个

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仍然在外部函数中定义,并且结果返回的函数在其值

上关闭。

函数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));

makeAdder返回如下函数:

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

makeAdder(5)调用函数makeAdder,其中x绑定为5。这个函数返回另一个函数。此外,由于提供了x的值,因此makeAdder中的匿名函数知道x的值。

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

function(2) {
  return 5 + 2;
}

将输出7.

这是如何工作的?

在闭包中定义的函数'记住'中的环境

ref