Javascript - 具有简单加法器功能的闭包

时间:2016-03-17 06:39:26

标签: javascript function closures

我是一名Python编码员,更多地了解Javascript。

由于某种原因,我在理解闭包时遇到了一些困难。我已经制作了简单的加法器函数(即应该执行类似Add(1)= 1,Add(2)= 3 ...)

我一直试图通过console.log /打印所有内容来了解​​幕后发生的事情,但我对这些功能如何不同感到困惑,如果它们是:

var makeAdder = function(num){
  var addNum=num;
  var letsAdd = function(num){
    return addNum+=num;
  };
  return letsAdd;
};

var makeAdder = function(numa){
  var letsAdd = function(numb){
    return numa+numb;
  };
  return letsAdd;
};

var a = makeAdder(2);
console.log(a(5));
// should produce 7 at the end

非常感谢任何资源或帮助!我还没有找到关于闭包的好文章/:

4 个答案:

答案 0 :(得分:1)

无需添加闭包即可实现简单加法器功能的解决方案。

function makeAdder(num){
  if(!this.addNum){
    this.addNum=0;
  }
  return this.addNum+=num;
}

console.log("------------makeAdder----------");

console.log(makeAdder(10)); // output - 10
console.log(makeAdder(20)); // output - 30
console.log(makeAdder(30)); // output - 60

答案 1 :(得分:0)

首先 makeAdder添加到上次添加的值addNum+=num;,这就是为什么您可以继续添加以前添加的值

因此,首先makeAdder将返回您想要的内容

var a = makeAdder(2);
a(1);//output 3
a(4);//output 7

但是, makeAdder未添加到上次添加的值numa+numb;,因此无法将其添加到之前的值

var a = makeAdder(2);
a(1);//output 3
a(4);//output 6 not 7

答案 2 :(得分:0)

在Javascript中,当函数内部声明变量时,它变为该函数的本地变量。因此,当函数完成执行时,垃圾收集器会销毁所有局部变量。 但如果关闭,它不能。因为这些函数变量的链接是从函数外部创建的。enter image description here

在上图中,N移出F的范围并在外面可用。 关于闭包的好读物是Stoyan Stefanov的面向对象的Javascript

因此,在闭包中,局部变量不会被销毁,并且存储该值以供将来使用。在您的情况下,您使用局部变量 addnum numa in function letsAdd ,然后返回到函数外部,因此可以从外部获取,从而创建链接。

第一个makeadder具有局部变量,该变量具有最后两个值的总和,即保存 addnum 。因此,当你下次打电话时,你得到了总和。 虽然第二个函数有一个指向 numa 的外部链接,但它不是最后两个变量的总和。因此保存的值只是第一个参数的值。 因此,在后续调用中,add的第一个参数在两个函数中都是不同的。

答案 3 :(得分:0)

更简单,更简洁:

function makeAdder(n) { 
    return function(x) {
        return x + n;   // closure over n
    };
};

var add5 = makeAdder(5);    
var add7 = makeAdder(7);    

console.log(add5(10));   // 15
console.log(add7(10));   // 17