function makeAdder(x) {
return function(y) {
console.log("X:" + x + " Y:" + y);
return x + y;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
console.log(add5(2));
console.log(add10(2));
好的,我对闭包时的developer.mozilla上的这个例子感到有些困惑。
如果有人可以尽可能详细地解释,以便让我能够理解闭合。
忽略console.log,我刚刚添加了以查看显示的值,从中可以看出,当您执行add5时,x为5,y为2。
我安慰add5()看看我得到了什么,我得到了NaN - 我猜这是因为我没有指定一个参数,因为它想要一个,并且不能添加一个未定义的数字。
所以混淆是在makeAdder的内部函数中的参数y。
希望有人可以提供比mozilla更好的解释......我认为线索是环境,但我是新手,所以需要专家的帮助。
由于
答案 0 :(得分:0)
function makeAdder(x) {
return function(y) {
console.log("X:" + x + " Y:" + y);
return x + y;
};
}
makeAdder
需要一个名为x
的参数,并返回一个需要参数y
的新函数。执行此内部函数时,外部作用域的x
将添加到参数y
,并返回总和。
var add5 = makeAdder(5);
将创建内部函数的新实例并将其存储到add5
。此内部函数的x
设置为5
。在使用add5
执行add5(2)
时,这将返回7
,因为x
值(外部范围5
)将添加到参数2
add10
的程序是公平的。
编辑参数(y
或x
或两者)将为undefined
。 undefined+number
或undefined+undefined
会返回NaN
,因为一个或多个加数不是数字。
编辑2 :过程演练:
var add5 = makeAdder(5);
会将add5
设置为:
function(y) {
console.log("X:" + 5 + " Y:" + y);
return 5 + y;
}
因为makeAdder(5)
返回其内部函数并将x设置为5.因此,当现在使用var sum = add5(2);
执行时,此生成的函数将计算并返回5 + y
(5 + 2
)。< / p>
注意:它并不是真的将x设置为5
(而是仍然是对外部x的引用)但我认为这更容易理解,并且在此特定示例中不会改变任何内容