在 javascript 中调用函数后,我无法为变量赋值

I cannot assign a value to a variable after call a function in javascript

我正在根据本网站上某人提出的算法对流行的剪刀石头布蜥蜴电击游戏进行修改。 这是我的 Js:

//¿Es obligatorio declarar las variables?
var Elementos = ["AIRE", "OSCURIDAD", "AGUA", "FUEGO", "TIERRA"];
var resultados = [" empata con ", " derrota a ", " pierde con "];
var opcionUsuario = false;
var opcionMago = false;
console.log("Default " + opcionUsuario);

//¿Qué elemento eligió el usuario?
function elementoElegido(elemento){
    opcionUsuario = elemento;
    log.value = "Has elegido " + Elementos[opcionUsuario] + ".";    
    console.log("User picks " + opcionUsuario);
}

//¡A pelear!
function guerra(opcionUsuario){ 
    //console.log(opcionUsuario);

    if(opcionUsuario === false){
        log.value = "Por favor, elige un elemento primero joven aventurero."
    }else{
        opcionMago = Math.floor( Math.random() * (4 - 0 + 1) + 0 ); 
        combate(opcionUsuario, opcionMago);
    }

}

function combate(opcionUsuario, opcionMago) {         
      dif = opcionMago - opcionUsuario;
      if(dif < 0) {
          dif += Elementos.length;
      }
      while(dif > 2) {
          dif -= 2;
      }
      log.value = "Tu elección: " + Elementos[opcionUsuario] + resultados[dif] + "la elección del mago: " + Elementos[opcionMago] + ".";    

      //¡Vuelve a elegir!
      opcionUsuario = false;
      console.log(opcionUsuario);      
};

我将变量 opcionUsuario 设置为 false,但是当我再次 运行 函数 guerra 时,变量 opcion Usuario 带有函数 elementoElegido 确定的最后一个值。 如何再次将变量设置为 false 以强制用户在继续之前选择一个元素?为什么会这样?提前致谢。

这里是live example.

当您将值作为函数参数传递时,它会生成一个局部变量,并传递指定的值,因此:

function foo(bar){
  console.log(bar);
}

foo('hello world');

实际上是这样解释的:

function foo(bar){
   var bar = [bars value]; //in this case, 'hello world'
   console.log(bar); //logging the local variable
}

foo('hello world');

为了实现你想要的,你需要引用在外部作用域中声明的变量,这很容易做到:

var bar = 'hello world';

function foo(){
   console.log(bar);

   bar = 'goodbye world';
}

foo();//logs hello world
foo();//logs goodbye world;
console.log(bar); //goodbye world

注意:应尽可能限制对共享变量的访问,以减少意外结果和冲突。可能值得花时间研究实现此目的的架构,例如 module pattern.