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

时间:2015-10-08 23:00:18

标签: javascript

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

4 个答案:

答案 0 :(得分:2)

首先,只要有命名参数,就会有隐式变量声明。所以忘记上面的功能,只考虑这个

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

答案 1 :(得分:1)

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

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

答案 2 :(得分: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

答案 3 :(得分: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));