Javascript 工厂函数方法不更新变量

Javascript 工厂函数方法不更新变量,javascript,Javascript,我正在尝试用一种方法来设置工厂函数,该方法将更新所述工厂函数中特定变量的值。这看起来是一件很容易实现的事情,但是,每当我测试它时,我都会得到变量的初始设置值,而不是更新后的值。我确信,当涉及到范围界定时,我遗漏了一些细微差别,但这里到底发生了什么 const factory = () => { let color = "black" const changeColor = () => { color = "white" } retu

我正在尝试用一种方法来设置工厂函数,该方法将更新所述工厂函数中特定变量的值。这看起来是一件很容易实现的事情,但是,每当我测试它时,我都会得到变量的初始设置值,而不是更新后的值。我确信,当涉及到范围界定时,我遗漏了一些细微差别,但这里到底发生了什么

const factory = () => {
let color = "black"

const changeColor = () => {
    color = "white"
}

return {color, changeColor}
}
假设我在某处实际使用了工厂函数:

const example = factory()
example.changeColor()
预期的

example.color === "white"
实际值:

example.color === "black"

我错过了什么?运行
changeColor()
后,我希望
color
切换为白色,但每当我检查时,它仍保持为黑色。

您将分配给闭包中的局部变量,而不是包含原始颜色值副本的对象属性

可以使用getter使属性访问变量

const工厂=()=>{
让color=“黑色”;
常量changeColor=()=>{
color=“白色”
};
返回{
获取颜色(){
返回颜色;
},
变色
};
}
常量示例=工厂();
例如,changeColor();

log(例如,color)指定给闭包中的局部变量,而不是包含原始颜色值副本的对象属性

可以使用getter使属性访问变量

const工厂=()=>{
让color=“黑色”;
常量changeColor=()=>{
color=“白色”
};
返回{
获取颜色(){
返回颜色;
},
变色
};
}
常量示例=工厂();
例如,changeColor();

log(例如,color)您返回的是颜色的值,而不是对颜色变量本身的引用,因此闭包在这种情况下无效,您将始终获得初始值“black”。您可以通过使用
new
将其保存到上下文和init来解决此问题(前提是使用
函数而不是箭头函数)

const factory=函数(){
this.color=“black”;
this.changeColor=()=>{
this.color=“白色”;
};
};
const example=新工厂();
例如,changeColor();

log(例如,color)您返回的是颜色的值,而不是对颜色变量本身的引用,因此闭包在这种情况下无效,您将始终获得初始值“black”。您可以通过使用
new
将其保存到上下文和init来解决此问题(前提是使用
函数而不是箭头函数)

const factory=函数(){
this.color=“black”;
this.changeColor=()=>{
this.color=“白色”;
};
};
const example=新工厂();
例如,changeColor();

log(例如,color)
在arrow函数中使用
似乎是我的失误-我认为使用
可能是解决方案,但当我测试它时,我仍然在arrow函数中使用它,而不是传统函数。当我更新到一个传统函数并使用
this.color
时,它按预期工作。谢谢抱歉,但我认为这个答案有点误导,这与在闭包中分配局部变量无关,他的赋值是有效的,问题是他如何访问它而不是闭包problem@YairCohen这就是我的观点。他可以使用getter来访问闭包变量,就好像它是一个属性一样。好吧,我现在明白了,我的坏:)在arrow函数中使用
这个
似乎是我出错的地方-我认为使用
这个
可能是解决方案,但当我测试它时,我仍然在arrow函数中使用它,而不是传统的函数。当我更新到一个传统函数并使用
this.color
时,它按预期工作。谢谢抱歉,但我认为这个答案有点误导,这与在闭包中分配局部变量无关,他的赋值是有效的,问题是他如何访问它而不是闭包problem@YairCohen这就是我的观点。他可以使用getter使访问闭包变量就像访问属性一样