JavaScript闭包 - 程序流程

时间:2017-03-15 06:42:57

标签: javascript closures

任何人都可以解释这段代码的工作原理吗?

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

参考: https://mozilla.org/en/docs/Web/JavaScript/Closures

3 个答案:

答案 0 :(得分:1)

当您致电makeAdder(5)时,它会返回对新功能的引用。

function(y) {
    return x + y;
};

所以add5保留了引用。在您致电add5(2)之后,您将2传递给该功能。在它想要返回x + y时,它开始找到变量。从x开始,它看起来并且看到x未在其中定义并转到scope,其中定义了内部函数`here

function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

在此处定义了x,因为您在var x期间调用并传递了add5 = makeAdder(5);。在它找到y并找到它的范围之后。毕竟返回x + y

这个想法是这样的,每个函数都有一个对它的creater(它被定义的地方)的引用,当它找不到变量时,它会发现它更大,所以直到全局范围。 /强>

答案 1 :(得分:1)

function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

当您执行var add5 = makeAdder(5); add5成为返回我的makeAdder的函数时, add5将关注

function(y){
   return 5 + y;
}

所以,当你执行add5(2)时,它会执行5 + 2并返回7;

答案 2 :(得分:0)

makeAdder(5) 

x => 5和y没有值,因此x + y => 5 + 0 => 5

var add5 = makeAdder(5);
add5(2);

我们已经为函数makeadder创建了变量x =>五 所以现在我们传递y => 2和x => 5所以x + y => 5 + 2 => 7

在内部函数中可访问的外部函数变量的这个属性在javascript中称为closure属性。外部函数也无法访问该y变量。