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

在javascript中调用函数后,我无法为变量赋值,javascript,function,variables,global-variables,Javascript,Function,Variables,Global Variables,我正在根据这个网站上有人提出的一种算法对流行游戏《石头剪纸蜥蜴斯波克》进行修改。 这是我的Js: //¿Es obligatorio declarar las variables? var Elementos = ["AIRE", "OSCURIDAD", "AGUA", "FUEGO", "TIERRA"]; var resultados = [" empata con ", " derrota a ", " pierde con "]; var opcionUsuario = false;

我正在根据这个网站上有人提出的一种算法对流行游戏《石头剪纸蜥蜴斯波克》进行修改。 这是我的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);      
};
//?是义务声明变量吗?
var Elementos=[“AIRE”、“OSCURIDAD”、“AGUA”、“FUEGO”、“TIERRA”];
var resultados=[“empata con”、“derrota a”、“pierde con”];
var opcionUsuario=假;
var opcionMago=false;
console.log(“默认值”+opcionUsuario);
//埃利吉奥·埃利吉奥·乌萨里奥是谁?
功能元素法律(elemento){
opcionUsuario=elemento;
log.value=“Has elegido”+Elementos[opcionUsuario]+”;
log(“用户选择”+opcionUsuario);
}
//“皮雷!
函数guerra(opcionUsuario){
//控制台日志(opcionUsuario);
if(opcionUsuario==false){
log.value=“欢迎您,elige un elemento primero joven aventurero。”
}否则{
opcionMago=Math.floor(Math.random()*(4-0+1)+0);
combate(opcionUsuario、opcionMago);
}
}
函数组合(opcionUsuario,opcionMago){
dif=opcionMago-opcionUsuario;
if(dif<0){
dif+=元素长度;
}
而(dif>2){
dif-=2;
}
log.value=“Tu elección:“+Elementos[opcionUsuario]+resultados[dif]+”la elección del mago:“+Elementos[opcionMago]+”;
//“给我一个电子琴!
opcionUsuario=假;
控制台日志(opcionUsuario);
};
我将变量opcionUsuario设置为false,但是当我再次运行函数guerra时,变量opcion Usuario带有函数elementoElegido确定的最后一个值。 如何再次将变量设置为false,以强制用户在继续之前选择一个元素?为什么会发生这种情况?提前谢谢


以下是一个。

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

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

注意:应尽可能限制对共享变量的访问,以减少意外结果和冲突。您可能值得花时间研究实现这一点的体系结构,例如。

有什么理由不能使用
opcionUsuario=false?由于您将其作为参数传递,因此它的作用域隐式限定为函数。由于您是全局声明变量,因此根本无法将其作为参数传递,它将起作用。
opcionUsuario
在函数中指的是局部变量(已在参数中声明),而不是全局
opcionUsuario
@JesseKernaghan,当您在函数外部设置变量时,它隐式声明为全局变量?@benvoid不一定。。。从技术上讲,这是变量的范围。在本例中,由于您已将变量声明在与函数相同的范围内,因此所有函数都可以访问该变量(您正在
elementoElegido
函数中使用该变量)。