Javascript——具有简单加法器函数的闭包

Javascript——具有简单加法器函数的闭包,javascript,function,closures,Javascript,Function,Closures,我是一名Python程序员,学习更多关于Javascript的知识 出于某种原因,我在理解闭包时有点困难。我已经生成了简单的加法器函数(也就是说,应该做加法(1)=1,加法(2)=3…) 我一直试图通过console.log/printing了解引擎盖下发生了什么,但我对这些功能的不同之处感到困惑,如果它们是: var makeAdder = function(num){ var addNum=num; var letsAdd = function(num){ return ad

我是一名Python程序员,学习更多关于Javascript的知识

出于某种原因,我在理解闭包时有点困难。我已经生成了简单的加法器函数(也就是说,应该做加法(1)=1,加法(2)=3…)

我一直试图通过console.log/printing了解引擎盖下发生了什么,但我对这些功能的不同之处感到困惑,如果它们是:

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

第一个
makeAdder
添加到最后一个附加值
addNum+=num这就是为什么您可以继续添加到以前添加的值

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

var a = makeAdder(2);
a(1);//output 3
a(4);//output 7
但是,second
makeAdder
没有添加到最后一个附加值
numa+numb因此无法将其添加到上一个值

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

在Javascript中,当在函数内声明变量时,它将成为该函数的局部变量。因此,当函数完成执行时,垃圾收集器将销毁所有局部变量。 但在关闭的情况下,它不能。因为这些函数变量的链接是从函数外部创建的

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

因此,在闭包中,局部变量不会被销毁,并且会存储值以备将来使用。在您的情况下,您是通过在函数letsAdd中使用局部变量addnumnuma来创建闭包的,然后这些变量会在函数外部返回,因此从外部可用,从而创建一个链接

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

不使用闭包的简单加法器函数的解决方案

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

简单一点,简洁一点:

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

var makeAdder
定义了两次。。。为什么?作品很好看:@ArunPJohny请检查这把小提琴他们有点different@gurvinder372错过了
+=
中的
=
你了解全局变量是如何工作的吗?@RayonDabre尝试通过执行
a(3)向a添加另一个值再次。在第一种方法中,它将添加到先前添加的值中,在第二种方法中(就像在你的小提琴中),它将添加到原始构造函数值@RayonDabre中,并查看与第一种
makeAdder
@Guru的差异,这种差异看起来就像
a=a+2
a+2
@RayonDabre是的。