javascript - 使用函数声明与函数表达式在模块模式中切换变量
问题描述
我有一个模块模式,其中一个变量将 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());
推荐阅读
- mysql - 我想在一个月内将一些行值作为每天的列值
- tfs - 从某个变更集从 TFS 迁移到 Azure DevOps Services
- excel - 如何获取每组记录中缺失的记录列表?
- android - 是否可以在 SO 库中公开 C API 以访问 Android JAVA 方法?
- python - 是否可以在 folium python 中为矩形着色
- chisel - 将子模块的寄存器添加到新/实例化它的模块的 regmap()
- swift - 手势识别器不起作用。执行下方元素的操作 - SWIFT
- java - JAX-RS 客户端 PUT/POST 请求:无法访问正文中的实体(对象)
- cloud - 我无法删除我的 droplets 或在我的帐户上执行任何选项
- angular - 带有Angular的ag网格:单击按钮时为单个单元格加载数据