在javascript中学习闭包以及它是如何工作的

时间:2017-10-31 23:28:55

标签: javascript closures

我尝试学习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。关闭是什么?任何人都可以用最简单的方式解释这个。感谢

3 个答案:

答案 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();功能