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