当我检查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
答案 0 :(得分:2)
首先,只要有命名参数,就会有隐式变量声明。所以忘记上面的功能,只考虑这个
var example = function() {
var x = 5;
return function(y) {
return x + y;
}
}
var inner = example();
console.log(inner(5));
> '10'
你明白上面的工作原理吗?如果不是,我建议调查javascript闭包及其含义。
在上面的函数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。
这是如何工作的?
闭包中定义的函数'记住'中的环境 是它的创建。
答案 3 :(得分:1)
函数makeAdder
返回一个函数,因此变量add5
和add10
只是对函数的引用。当您使用参数值调用这些函数时,该函数最终会作为函数中的参数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));