我是一名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
非常感谢任何资源或帮助!我还没有找到关于闭包的好文章/:
答案 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中,当函数内部声明变量时,它变为该函数的本地变量。因此,当函数完成执行时,垃圾收集器会销毁所有局部变量。 但如果关闭,它不能。因为这些函数变量的链接是从函数外部创建的。
在上图中,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