首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >学习javascript中的闭包及其工作原理

学习javascript中的闭包及其工作原理
EN

Stack Overflow用户
提问于 2017-11-01 07:28:55
回答 3查看 65关注 0票数 0

我尝试在JavaScript中学习闭包。

代码语言: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());

我得到了:

代码语言:javascript
复制
inside foo, call to f(): 2
call to g(): 1
call to f(): 2

现在最让我困惑的是,为什么f()在函数外仍然是2。这就是闭包的作用吗?有人能用最简单的方式解释一下吗?谢谢

EN

回答 3

Stack Overflow用户

发布于 2018-09-12 12:38:55

当然,您可以使用全局变量来保存总数。但请记住,如果你(Ab)使用全局变量,这家伙会把你生吞活剥的。

对于这样的场景,闭包是在不使用全局变量的情况下维护函数调用之间状态的最佳选择。让我们看看如何..。

代码语言:javascript
复制
(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
}());

票数 1
EN

Stack Overflow用户

发布于 2017-11-01 08:20:21

这不是一个结束,真的。您需要包装所有内容,并且只公开您想要公开的属性-这些属性可以保留对非公共部分的访问。

搜索javascript模式...有一些关于模块、单例等的很好的参考

票数 0
EN

Stack Overflow用户

发布于 2018-09-12 09:12:30

代码语言:javascript
复制
foo();  //2
foo();  //2
foo();  //2

如果只调用第一次foo();,那么输出将在foo内,调用f():2

第二次foo();,然后输出将在foo内,调用f(): 2

因为在内存中声明的每个函数都会使用

但是,当您在使用foo();之后使用as f();

代码语言:javascript
复制
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();功能用作闭包函数

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47045992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档