如何解决使用函数声明与函数表达式在模块模式内切换变量
我有一个模块模式,其中的变量将currentPlayer设置为1。我使用函数表达式来切换该变量
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。
但是,使用toggleCurrentPlayer()
更改this
函数似乎能够成功更改变量
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 game = (() => {
let obj = {
currentPlayer: 1,toggleCurrentPlayer: () => {
if (obj.currentPlayer == 1) {
obj.currentPlayer = 2;
} else {
obj.currentPlayer = 1;
}
}
};
return obj;
})();
console.log(game.currentPlayer);
game.toggleCurrentPlayer();
console.log(game.currentPlayer);
另一种实现方法是使用获取变量的getter函数。
const game = (() => {
let currentPlayer = 1;
const toggleCurrentPlayer = () => {
if (currentPlayer == 1){
currentPlayer = 2 ;
}
else {
currentPlayer = 1;
}
};
const getCurrentPlayer = () => currentPlayer
return {getCurrentPlayer,toggleCurrentPlayer};
})();
console.log(game.getCurrentPlayer());
game.toggleCurrentPlayer();
console.log(game.getCurrentPlayer());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。