什么';使用闭包时使用以下JavaScript语法的原因是什么?

什么';使用闭包时使用以下JavaScript语法的原因是什么?,javascript,function,variables,closures,Javascript,Function,Variables,Closures,在研究闭包时,我看了开发人员的Mozilla文章,看到了下面的代码: var counter = (function() { var privateCounter = 0; function changeBy(val) { privateCounter += val; } return { increment: function() { changeBy(1); }, decrement: function() { ch

在研究闭包时,我看了开发人员的Mozilla文章,看到了下面的代码:

var counter = (function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }

  return {
    increment: function() {
      changeBy(1);
    },

    decrement: function() {
      changeBy(-1);
    },

    value: function() {
      return privateCounter;
    }
  };
})();

console.log(counter.value());  // 0.

counter.increment();
counter.increment();
console.log(counter.value());  // 2.

counter.decrement();
console.log(counter.value());  // 1.
我对函数如何归属于变量
counter
感到困惑,因为函数最初是由这些括号解析的,毕竟,还有两个不可解析的括号在一起。。。我只是想知道,这种语法的原因是什么?我当然会这样做:

var counter = function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }

  return {
    increment: function() {
      changeBy(1);
    },

    decrement: function() {
      changeBy(-1);
    },

    value: function() {
      return privateCounter;
    }
  };
};
但后来我发现了错误

未捕获类型错误:counter.value不是函数

当我执行
console.log(counter.value())时


有人能给我解释一下吗?

您看到的是一个立即调用的函数表达式或IIFE。此代码正在创建一个函数,然后立即调用该函数,然后将该函数的返回值分配给
计数器
。因此,
计数器
不是一个函数,它是一个具有三个属性的对象:
增量
减量
,和

他们使用iLife的原因是为了使本质上是一个私有变量
privateCounter
仅在该函数内的其他代码的作用域内,这意味着只有
增量
减量
、和
可以访问它

如果他们不关心将变量设为私有,则等效代码为:

var publicCounter = 0;
function changeBy(val) {
  publicCounter += val;
}

var counter = {
  increment: function() {
    changeBy(1);
  },
  decrement: function() {
    changeBy(-1);
  },
  value: function() {
    return publicCounter;
  }
}