我尝试学习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。关闭是什么?任何人都可以用最简单的方式解释这个。感谢
答案 0 :(得分:1)
我认为你很困惑“为什么f可以访问x甚至我在外部范围宣布它”。这是因为JavaScript首先在 foo 中启动匿名函数, x 对此函数可见。然后将其分配给全局变量 f ,因此它包含 foo 的范围。
答案 1 :(得分:0)
这不是封闭,真的。你需要包装所有内容,只展示你想要公开的属性 - 那些可以保留对非公共部分的访问权。
搜索javascript模式......对模块,单例等有一些很好的引用
答案 2 :(得分:0)
foo(); //2
foo(); //2
foo(); //2
如果仅是第一次调用foo();
,则输出将在foo内部,请调用f():2
第二次foo();
,则输出将在foo内部,调用f(): 2
因为每个函数都在内存中声明然后使用
但是在使用f();
之后用作foo();
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();
功能