有人可以解释这个Javascript闭包示例

时间:2014-05-28 15:13:35

标签: javascript closures

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更好的解释......我认为线索是环境,但我是新手,所以需要专家的帮助。

由于

1 个答案:

答案 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的程序是公平的。

未传递参数(内部或外部函数或两者)时,

编辑参数(yx或两者)将为undefinedundefined+numberundefined+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 + y5 + 2)。< / p>

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