有人能解释一下这个Javascript闭包示例吗

有人能解释一下这个Javascript闭包示例吗,javascript,closures,Javascript,Closures,好的,我对闭包下developer.mozilla上的这个例子有点困惑 如果有人能尽可能详细地解释,以便我了解闭包 忽略console.log,我只是添加了它来查看显示的值,从中我可以看到当执行add5时,x是5,y是2 我安慰add5()看看我得到了什么,我得到了NaN——我猜这是因为我没有指定参数,因为它需要一个参数,并且不能向未定义的参数添加数字 所以混淆的是Madedder内部函数中的论点y 希望有人能提供一个比mozilla更好的解释…我认为线索是环境,但我是新手,所以需要专家的帮助

好的,我对闭包下developer.mozilla上的这个例子有点困惑

如果有人能尽可能详细地解释,以便我了解闭包

忽略console.log,我只是添加了它来查看显示的值,从中我可以看到当执行add5时,x是5,y是2

我安慰add5()看看我得到了什么,我得到了NaN——我猜这是因为我没有指定参数,因为它需要一个参数,并且不能向未定义的参数添加数字

所以混淆的是Madedder内部函数中的论点y

希望有人能提供一个比mozilla更好的解释…我认为线索是环境,但我是新手,所以需要专家的帮助

谢谢

makeAdder
需要一个名为
x
的参数,并返回一个需要该参数
y
的新函数。执行此内部函数时,外部作用域的
x
将添加到参数
y
,并返回总和

var add5=makeAdder(5)
将创建内部函数的新实例,并将其存储到
add5
<此内部函数的code>x设置为
5
。使用
add5(2)
执行
add5
时,将返回
7
,因为
x
值(外部范围
5
)将添加到参数
2

add10
的程序相同

编辑当不传递参数(内部或外部函数或两者)时,参数(
y
x
或两者)将
未定义
undefined+number
undefined+undefined
返回
NaN
,因为一个或多个和不是数字

编辑2:过程演练:

var add5=makeAdder(5)
add5
设置为:

function makeAdder(x) {
    return function(y) {
        console.log("X:" + x + " Y:" + y);
        return x + y;
    };
}
因为
makeAdder(5)
返回其内部函数并将x设置为5。因此,当现在使用
var sum=add5(2)执行时此生成的函数将计算并返回
5+y
5+2


注意:它并没有真正将x设置为
5
(相反,它仍然是对外部x的引用),但我认为这更容易理解,并且不会改变这个特定示例中的任何内容

您到底不明白什么,您有什么“困惑”?问题是什么?你读过吗?你对NaN的预感是正确的。只需阅读你上面提供的内容。我的困惑实际上是“y”。这是返回函数的参数,即
add5
add10
的参数。谢谢,这是有道理的,但我仍然对“y”变量感到困惑。我将解释为什么……这都是有道理的,但它是如何决定add5(2)应该是“y”而不是“x”的。对不起,如果我听起来很愚蠢。这解释了你的问题吗?如果是,请标记为已解决
function makeAdder(x) {
    return function(y) {
        console.log("X:" + x + " Y:" + y);
        return x + y;
    };
}
function(y) {
   console.log("X:" + 5 + " Y:" + y);
   return 5 + y;
}