Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用函数声明与函数表达式切换模块模式内的变量_Javascript_Design Patterns_Function Declaration_Module Pattern_Function Expression - Fatal编程技术网

Javascript 使用函数声明与函数表达式切换模块模式内的变量

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

我有一个模块模式,其中一个变量将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

但是,使用
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
上关闭一个箭头函数。但是是的,考虑到
游戏
常量
,使用它看起来也不错。它正在访问保存在闭包中的变量。请参阅