我尝试在JavaScript中学习闭包。
let f, g;
function foo() {
let x;
f = function() {
return ++x; };
g = function() {
return --x; };
x = 1;
console.log('inside foo, call to f(): ' + f());
}
foo();
console.log('call to g(): ' + g());
console.log('call to f(): ' + f());
我得到了:
inside foo, call to f(): 2
call to g(): 1
call to f(): 2
现在最让我困惑的是,为什么f()在函数外仍然是2。这就是闭包的作用吗?有人能用最简单的方式解释一下吗?谢谢
发布于 2018-09-12 12:38:55
当然,您可以使用全局变量来保存总数。但请记住,如果你(Ab)使用全局变量,这家伙会把你生吞活剥的。
对于这样的场景,闭包是在不使用全局变量的情况下维护函数调用之间状态的最佳选择。让我们看看如何..。
(function() {
function addFn(arg) {
var total = 0;
var mul = arg;
if (total > 5) {
return function(val) {
total += val;
console.log("hello:" + total);
return total + 9;
}
} else {
console.log("hey:" + mul);
return function(arg1) {
mul = mul * arg1;
console.log("multiply:" + mul);
return mul;
};
}
};
var mulcc = addFn(7);
console.log(mulcc);
mulcc(2); // 14
mulcc(5); // 70
mulcc(1); // 70
}());
发布于 2017-11-01 08:20:21
这不是一个结束,真的。您需要包装所有内容,并且只公开您想要公开的属性-这些属性可以保留对非公共部分的访问。
搜索javascript模式...有一些关于模块、单例等的很好的参考
发布于 2018-09-12 09:12:30
foo(); //2
foo(); //2
foo(); //2
如果只调用第一次foo();
,那么输出将在foo内,调用f():2
第二次foo();
,然后输出将在foo内,调用f(): 2
因为在内存中声明的每个函数都会使用
但是,当您在使用foo();
之后使用as f();
时
console.log('call to f(): ' + f()); //print 3
console.log('call to f(): ' + f()); //print 4
console.log('call to f(): ' + f()); //print 5
因为您已经将f();
功能用作闭包函数
https://stackoverflow.com/questions/47045992
复制相似问题