【问题标题】:How this function passes arguments to another inner function parameters此函数如何将参数传递给另一个内部函数参数
【发布时间】:2015-10-08 23:00:17
【问题描述】:

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

【问题讨论】:

  • 我想我明白了,因为 makeAdder(x) 返回函数(y) 所以 add5 的值是函数(y) 所以当我做 add5(2) 时我将 2 传递给 y跨度>

标签: javascript


【解决方案1】:

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

var example = function() {
  var x = 5;
  return function(y) {
    return x + y;
  }
}
var inner = example();
console.log(inner(5));
> '10'

您了解以上内容的工作原理吗?如果不是,我建议您研究一下 javascript 闭包及其含义。

Javascript Closures

在上面的函数 makeAdder 中,唯一的区别是我们传递了 x 的值。但是 x 仍然定义在外部函数中,并且返回的结果函数关闭了它的值

【讨论】:

    【解决方案2】:

    函数makeAdder返回一个函数,所以变量add5add10只是对函数的引用。当您使用参数 vale 调用这些函数时,最终会成为函数中的参数 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));
    

    【讨论】:

    • 我知道还有其他不错的答案,但这个答案对我来说很棒,它用我理解的语言与我交谈,谢谢。
    【解决方案3】:

    makeAdder 返回一个函数,如下所示:

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

    【讨论】:

      【解决方案4】:

      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

      【讨论】:

        最近更新 更多