Javascript 为什么闭包中的自由变量值在直接访问时只返回初始值?

Javascript 为什么闭包中的自由变量值在直接访问时只返回初始值?,javascript,closures,Javascript,Closures,我对上面的行为感到困惑,尤其是最后一行 我希望c也返回4以及getC(),但它只返回初始值0 有人能帮我理解幕后发生了什么吗?当你把c传递到返回{increment,getC,c},c传递它的值,而不是它的引用,因为它是一种基本类型(简单的,例如:数字、字符串) 因此,后续函数调用不会更改函数返回。 请注意,getC工作的原因是函数访问原始的c引用,而不仅仅是值。当您使用var{increment,getC,c}=Counter()时创建新变量c,由于数字是通过值传递的,而不是通过引用传递的,因

我对上面的行为感到困惑,尤其是最后一行

我希望
c
也返回
4
以及
getC()
,但它只返回初始值0


有人能帮我理解幕后发生了什么吗?

当你把
c
传递到
返回{increment,getC,c}
c
传递它的值,而不是它的引用,因为它是一种基本类型(简单的,例如:数字、字符串)

因此,后续函数调用不会更改函数返回。
请注意,
getC
工作的原因是函数访问原始的
c
引用,而不仅仅是值。

当您使用
var{increment,getC,c}=Counter()时
创建新变量
c
,由于数字是通过值传递的,而不是通过引用传递的,因此不能从计数器内部修改相同的c值。同样可以编写
返回{increment,getC,c:0}
。对象属性不是引用,
.c
包含一个值。
function Counter() {
  var c = 0;
  function increment() {
    c++;
  }
  function getC() {
    return c;
  }
  return { increment, getC, c };
}

var { increment, getC, c } = Counter();
increment();
increment();
increment();
increment();
console.log(getC());        // 4
console.log(c);             // 0