Javascript 使用函数声明与函数表达式切换模块模式内的变量
我有一个模块模式,其中一个变量将currentPlayer设置为1。我使用函数表达式来切换该变量Javascript 使用函数声明与函数表达式切换模块模式内的变量,javascript,design-patterns,function-declaration,module-pattern,function-expression,Javascript,Design Patterns,Function Declaration,Module Pattern,Function Expression,我有一个模块模式,其中一个变量将currentPlayer设置为1。我使用函数表达式来切换该变量 const game = (() => { let currentPlayer = 1; const toggleCurrentPlayer = () => { if (currentPlayer == 1){ currentPlayer = 2 ; } else { cu
const game = (() => {
let currentPlayer = 1;
const toggleCurrentPlayer = () => {
if (currentPlayer == 1){
currentPlayer = 2 ;
}
else {
currentPlayer = 1;
}
};
return {currentPlayer, toggleCurrentPlayer};
})();
如果我运行game.currentPlayer
它记录1,然后运行game.toggleCurrentPlayer()
,它不会按预期更改currentPlayer
,它仍然返回1
但是,使用this
更改toggleCurrentPlayer()
函数似乎能够成功更改变量
function toggleCurrentPlayer(){
if (this.currentPlayer == 1){
this.currentPlayer=2;
}
else if (this.currentPlayer == 2){
this.currentPlayer=1;
}
};
我知道函数声明和函数表达式对于关键字this
有不同的含义,但是为什么toggleCurrentPlayer()
只能与this
关键字一起正常工作,而不能单独设置变量呢?当函数不这样做时
return {currentPlayer, toggeleCurrentPlayer};
它将currentPlayer
变量的初始值复制到对象中
返回的对象包含变量的值,而不是对变量本身的引用。重新指定变量对对象没有影响
您可以做的是在函数内部创建一个对象,并对其进行修改
const游戏=(()=>{
设obj={
当前玩家:1,
toggleCurrentPlayer:()=>{
如果(obj.currentPlayer==1){
obj.currentPlayer=2;
}否则{
obj.currentPlayer=1;
}
}
};
返回obj;
})();
console.log(game.currentPlayer);
game.toggleCurrentPlayer();
console.log(game.currentPlayer)代码>当函数执行时
return {currentPlayer, toggeleCurrentPlayer};
它将currentPlayer
变量的初始值复制到对象中
返回的对象包含变量的值,而不是对变量本身的引用。重新指定变量对对象没有影响
您可以做的是在函数内部创建一个对象,并对其进行修改
const游戏=(()=>{
设obj={
当前玩家:1,
toggleCurrentPlayer:()=>{
如果(obj.currentPlayer==1){
obj.currentPlayer=2;
}否则{
obj.currentPlayer=1;
}
}
};
返回obj;
})();
console.log(game.currentPlayer);
game.toggleCurrentPlayer();
console.log(game.currentPlayer)代码>差异与声明toggleCurrentPlayer
的方式无关。这是关于修改局部变量与修改对象属性的关系。@Bergi所以我只能修改模块内的对象属性,但不能为模块内的变量指定新值?您的第一个代码确实可以很好地切换局部变量。问题在于game.currentPlayer
属性不是变量的实时视图,它只保留最初创建的值。(这是反向的:模块外部的任何代码都可以使用game.currentPlayer=3;
分配对象属性,但只有模块范围内的代码才能访问和分配局部变量let currentPlayer
)我想知道他如何在游戏中更改currentPlayer变量差异与toggleCurrentPlayer
的声明方式无关。这是关于修改局部变量与修改对象属性的区别。@Bergi因此我只能修改模块内的对象属性,但我无法为模块内的变量指定新值模块?您的第一个代码确实可以很好地切换局部变量。问题是game.currentPlayer
属性不是变量的实时视图,它只保留您最初创建的值。(这是反向的:模块外部的任何代码都可以使用game.currentPlayer=3;
分配对象属性,但只有模块范围内的代码才能访问和分配局部变量let currentPlayer
)我想知道他如何在游戏中更改currentPlayer变量在这种情况下,如果没有IIFE,你甚至不需要IIFE。我在哪里可以获得obj
的作用域?我可以将其更改为使用game。currentPlayer
在切换函数中。哎呀,我错过了你在方法中没有使用这个
,而是使用了一个箭头函数closing覆盖obj
。但是,考虑到game
是const
,使用它似乎也很好。它正在访问一个保存在闭包中的变量。在这种情况下,如果没有IIFE,你甚至不需要IIFE。我在哪里可以获得obj
的作用域?我可以将其更改为使用game.currentPlayer
oggle function.Oops,我错过了你没有在方法中使用这个
,而是在obj
上关闭一个箭头函数。但是是的,考虑到游戏
是常量
,使用它看起来也不错。它正在访问保存在闭包中的变量。请参阅